PCA که مخفف Principal Component Analysis میباشد، یک الگوریتم یادگیری ماشین بدون نظارت (unsupervised) است که تلاش میکند ابعاد (تعداد ویژگیها) در یک مجموعه را کاهش دهد و در عین حال تا حد ممکن اطلاعات را کاهش دهد. باید توجه داشته باشیم که به بهانه کاهش دادن ابعاد، دیتای ارزشمند را نباید از دست داد. در ادامه روش pca را بررسی میکنیم.
به سراغ پایتون میرویم و کتابخانههای مورد نظر را ایمپورت میکنیم:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
%matplotlib inline
مجددا از دیتاست سرطان سینه استفاده میکنیم. زیرا تعداد فیچرهای آن به حد قابل قبولی زیاد است. همچنین نام آن را cancer میگذاریم:
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
cancer.keys()
#more details about the data:
print(cancer['DESCR'])
با دستور زیر یک دیتا فریم از data و سرستون فیچرها میسازیم:
df = pd.DataFrame(cancer['data'],\
columns=cancer['feature_names'])
df.head()
df.info()
مصورسازی دیتایی که ابعاد زیادی داشته باشد، کار راحتی نیست. بنابراین با استفاده از PCA دو جزء اصلی تشکیل دهنده دیتا را میبابیم و با استفاده از scatter Plot سعی میکنیم مصورسازی را انجام دهیم.
قبل از این مرحله نیاز داریم که دیتا را استاندارد کنیم. به نحوی که تفاضل هر مقدار را از میانگین ستون مربوطه بدست میآوریم و بر SD تقسیم میکنیم. مقدار بدست آمده، برابر با مقدار استاندارد شده آن مقدار خواهد بود:

این کار را با کتابخانه StandardScaler از preprocessing family انجام میدهیم. همچنین روی دیتای خود fit و transform میکنیم: (یادمان باشد که کدهای زیر مربوط به preprocessing هستند و نه روش ماشین لرنینگ)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(df)
scaled_data=scaler.transform(df)
-->scaled_data

در نهایت داده ما با نام scaled_data و از نوع numpy.ndarray خواهد بود که دارای 569 سطر و 30 ستون دارد که همگی از نوع استاندارد شده هستند. (یعنی مقدار متوسط صفر و sd=1 دارند.)
type(scaled_data)--> numpy.ndarray
scaled_data.shape --> (569, 30)
پیش پردازش یا Preprocessing در اینجا به پایان میرسد و اکنون دیتای ما آماده است که مدل ماشین لرنینگ را روی آن پیاده کنیم.روش PCA که با کتابخانه Scikit_Learn اجرا میشود، از نظر نحوه پردازش بسیار شبیه به سایر روشهای پیش پردازش سایکیتلرن است.
from sklearn.decomposition import PCA
زیرا عملا یک دیتاست داریم که میخواهیم ابعاد آن را کاهش دهیم و این یعنی preprocessing. یعنی در این دیتایی که 30 ستون دارد، میخواهیم تعداد ستونها را به 2 تا کاهش دهیم.
pca = PCA(n_components=2)
pca = pca.fit(scaled_data)
x_pca=pca.transform(scaled_data)
نکته:
به جای دو مرحله fit و transform میتوان در یک مرحله هر دوی آنها را انجام داد:
x_pca=pca.fit_transform(scaled_data)
scaled_data.shape

یعنی دیتای اسکیل شده ما 569 سطر و 30 ستون دارد. حال در مورد X_PCA نیز پارامتر shape را بدست میآوریم:
x_pca.shape

همانگونه که میبینیم تعداد ستونها به 2 تا کاهش یافته است. که این دو ستون در زیر مصورسازی شده است:
plt.figure(figsize=(8,6))
plt.scatter(x_pca[:,0],x_pca[:,1],\
c=cancer['target'],cmap='plasma')
plt.xlabel('First principal component')
plt.ylabel('Second Principal Component')

و یا به روشی دیگر در آن hue برابر با ستون تارگت از cancer قرار داده شده است که نشان میدهد سرطان خوشخیم است(1) یا بدخیم (0).
sns.scatterplot(x=x_pca[:,0],y=x_pca[:,1],\
hue=cancer['target'])
plt.xlabel('First principal component')
plt.ylabel('Second Principal Component')

مرور بیشتر:
ما 30 ستون داشتیم و با استفاده از روش PCA سعی کردیم تعداد آن را به 2 ستون کاهش دهیم. در واقع ما در حال حاضر دو component داریم. همچنین میتوان گفت دو component فعلی حاصل تاثیر تمام سایر ستونها (که فیچرهای دیتاست اصلی بودند) است. میتوان صفت چکیده را به این دو ستون داد.
pca.components_

برای فهم بهتر این دیتا آن را در قالب دیتافریم میآوریم:
df_comp=pd.DataFrame(pca.components_,\
columns=cancer['feature_names'])

برای مثال پارامتر mean radius روی پارامتر اول و دوم چکیده، به ترتیب تاثیر نسبی 0.21 و منفی 0.23 را داشته است. برای درک بهتر از heatMap استفاده میکنیم تا تاثیر هر پارامتر را بهتر ببینیم:
plt.figure(figsize=(12,6))
sns.heatmap(df_comp,cmap='plasma',)

با توجه به ستون عمودی سمت راست تصویر، رنگ زرد (بالای شاخص)، نشانگر تاثیر بیشتر و رنگ آبی (پایین شاخص) نشانگر تاثیر کمتر است. بنابراین برای مثال میتوان گفت فیچر mean area یک فیچر کم تاثیر است، درحالی که فیچر mean fractal dimension که رنگ مرتبط با آن زرد است، یک فیچر موثرتر است.
تحلیل دقیق اینکه هر فیچر چه مقدار در component نهایی تاثیرگذار است، نیازمند domain knowledge بسیار بالا میباشد. برای آنکه این موضوع را بهتر یاد بگیریم به سراغ مسئله قیمت خانه میرویم که سادهتر است. برای مثال در تعیین قیمت نهایی خانه پارامترهایی زیر تاثیرگذار هستند:
1- متراژ 2- تعداد اتاق 3- نزدیکی به مترو 4- تراکم جمعیت، 5- متوسط درآمد مردم منطقه
حال اگر بخواهیم این 5 پارامتر را به 2 یا 3 یا … پارامتر تبدیل کنیم، از روش PCA استفاده میکنیم. اما همیشه مسئله به این گویایی نیست. تنها چیزی که باید یاد بگیریم این است که PCA یک روش برای کاهش ابعاد یا dimension reduction است. ضمن اینکه هیچ نظارت و یا تعلیمی (observe & learn) نداریم و به همین دلیل نام آن را بدون نظارت(unsupervised) گذاشتهایم. در واقع خودش میبیند و یاد میگیرد (بدون اقدام ما).
منابع:
1- هفته چهاردهم از کانال ویدئویی آموزش دیتا ساینس- مونا حاتمی