Menerapkan PCA untuk menguji data untuk tujuan klasifikasi

10

Saya baru-baru ini belajar tentang PCA yang luar biasa dan saya telah melakukan contoh yang diuraikan dalam dokumentasi scikit-learn .

Saya tertarik untuk mengetahui bagaimana saya bisa menerapkan PCA ke titik data baru untuk tujuan klasifikasi.

Setelah memvisualisasikan PCA dalam bidang 2 dimensi (sumbu x, y), saya melihat bahwa saya mungkin dapat menggambar garis untuk memisahkan titik data sehingga satu sisi akan menjadi satu klasifikasi dan yang lainnya dari klasifikasi lain. Bagaimana cara menggambar "batas" ini dan menerapkannya pada titik data baru?

vlasnalknsd
sumber
3
PCA bukan penggolong, tetapi dimungkinkan untuk menempatkan pengamatan baru ke dalam PCA dengan asumsi variabel yang sama yang digunakan untuk "cocok" PCA diukur pada titik-titik baru. Kemudian Anda hanya menempatkan poin baru pada jumlah tertimbang dari skor variabel (pemuatan), bobot yang diberikan oleh data. Yang mengatakan, sewenang-wenang menarik garis melalui PCA Anda tidak terdengar seperti pilihan yang baik untuk saya ...
Gavin Simpson

Jawaban:

16

PCA adalah alat reduksi dimensi, bukan penggolong. Di Scikit-Learn, semua pengklasifikasi dan estimator memiliki predictmetode yang tidak dimiliki PCA . Anda harus menyesuaikan classifier pada data yang diubah PCA. Scikit-Learn memiliki banyak pengklasifikasi. Berikut adalah contoh penggunaan pohon keputusan pada data yang diubah PCA. Saya memilih classifier pohon keputusan karena berfungsi dengan baik untuk data dengan lebih dari dua kelas yang merupakan kasus dengan dataset iris.

from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

# load data
iris = load_iris()

# initiate PCA and classifier
pca = PCA()
classifier = DecisionTreeClassifier()

# transform / fit

X_transformed = pca.fit_transform(iris.data)
classifier.fit(X_transformed, iris.target)

# predict "new" data
# (I'm faking it here by using the original data)

newdata = iris.data

# transform new data using already fitted pca
# (don't re-fit the pca)
newdata_transformed = pca.transform(newdata)

# predict labels using the trained classifier

pred_labels = classifier.predict(newdata_transformed)

SciKit belajar memiliki alat yang mudah disebut Pipeline yang memungkinkan Anda untuk menyatukan transformator dan penggolong akhir:

# you can make this a lot easier using Pipeline

from sklearn.pipeline import Pipeline

# fits PCA, transforms data and fits the decision tree classifier
# on the transformed data
pipe = Pipeline([('pca', PCA()),
                 ('tree', DecisionTreeClassifier())])

pipe.fit(iris.data, iris.target)

pipe.predict(newdata)

Ini sangat berguna ketika melakukan validasi silang karena mencegah Anda secara tidak sengaja memasang kembali langkah APAPUN dari pipeline pada set data pengujian Anda:

from sklearn.cross_validation import cross_val_score
print cross_val_score(pipe, iris.data, iris.target)
# [ 0.96078431  0.90196078  1.        ]

Omong-omong, Anda bahkan mungkin tidak perlu menggunakan PCA untuk mendapatkan hasil klasifikasi yang baik. Dataset iris tidak memiliki banyak dimensi dan pohon keputusan sudah akan bekerja dengan baik pada data yang tidak diubah.

Austin Richardson
sumber
6
Mungkin penting untuk dicatat bahwa PCA dapat berguna bahkan jika dimensionalitasnya tidak berkurang. Anda dapat memiliki dataset dimensi dan arah yang diskriminatif adalah yang sesuai dengan varian maksimum. Anda menyimpan dimensi tetapi dasarnya berbeda. Memetakan data Anda berdasarkan basis-basis baru itu akan membantu membedakan kelas-kelas dengan lebih baik daripada dasar aslinya. dd
Vladislavs Dovgalecs
@ xeon Saya tidak tahu itu.
Austin Richardson
Mungkin lebih baik untuk melihat apakah Anda membayangkan PCA sebagai rotasi. Jika kebetulan dataset Anda memiliki properti ini sehingga kelas-kelas dapat dibedakan berdasarkan varians, maka rotasi ini akan menjadi yang Anda butuhkan.
Vladislavs Dovgalecs
2
@ xeon: Ketika semua dimensi disimpan, satu-satunya hal yang dicapai oleh PCA adalah dekorasi yang berhubungan dengan dataset. Memang bisa bermanfaat bagi beberapa pengklasifikasi, tetapi sebagian besar tidak peduli.
amoeba
1
@amoeba Saya sepenuhnya setuju, ini hanya detail kecil. Saya harus berurusan dengan dataset tertentu dan selalu ingat pelajaran itu.
Vladislavs Dovgalecs
0

Jika Anda ingin menerapkan PCA ke data baru, Anda harus memasukkan model terlebih dahulu pada beberapa dataset pelatihan. Apa model yang akan Anda tanyakan? Ini adalah vektor rata-rata yang Anda kurangi dari dataset, varian yang Anda gunakan untuk "memutihkan" setiap vektor data dan matriks pemetaan yang dipelajari. Jadi, untuk memetakan dataset baru dalam ruang yang sama dengan data pelatihan, pertama-tama Anda kurangi rata-rata, memutihkan dan memetakannya dengan matriks pemetaan.

Vladislavs Dovgalecs
sumber