다차원의 변수를 2차원의 그래프로 나타내기 위해서는 PCA를 사용해야 합니다.
오늘은 PCA로 변수를 압축 후 target이 잘 분리되어 있는지 그래프로 나타내겠습니다.
- Data Load 및 Import
iris data를 사용하여 진행하겠습니다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
data = load_iris()
이 data는 dictionary 형태로 되어 있으며, keys를 통해 어떤 데이터 항목이 있는지 알 수 있습니다.
data.keys()
>>> dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
- DataFrame 만들기
위 데이터 중에서 data, target, feature_names를 이용하여 DataFrame을 만들겠습니다.
df = pd.DataFrame(data.data, columns = data.feature_names)
df['target'] = data.target
df
이런 형태의 DataFrame이 만들어졌습니다.
이제 이 변수들을 2차원으로 압축하겠습니다.
- 변수 2차원으로 압축
2차원으로 압축하는 것은 n_components = 2를 설정해주시고, 3차원이면 3, 4차원은 4로 설정해주시면 됩니다.
pca = PCA(n_components=2)
x = df.drop('target', axis = 1)
y = df.target
pca_x = pca.fit_transform(x)
pca_x
압축한 변수를 pca_x로 선언하고 확인하면 이런 형태의 array로 구성됩니다.
이 array를 다시 보기 좋게 DataFrafme으로 변경해줍니다.
pca_df = pd.DataFrame(pca_x, columns = ['pca_1','pca_2'])
pca_df['target'] = y
pca_df
이제 그래프를 그리면 되는데, target이 숫자로 되어있어 어떤 것인지 분간이 가지 않아 변경을 해주려고 합니다.
iris data 중에서 target_names를 확인해보겠습니다.
data.target_names
>>> array(['setosa', 'versicolor', 'virginica'], dtype='<U10')
각 index number 별로 이름이 있습니다.
for문을 써서 빠르게 바꿔주겠습니다.
enumerate는 data의 순서(번호)와 값을 변환해주는 함수입니다.
for num, i in enumerate(data.target_names):
pca_df.replace(num, i, inplace = True)
보기 좋게 변환된 것을 확인 할 수 있습니다.
- 그래프 그리기
seaborn을 이용하여 scatterplot을 그리겠습니다.
여기서 style을 target column에 적용하면 marker가 변합니다. marker size는 's' args를 통해 변경할 수 있습니다.
import seaborn as sns
plt.figure(figsize = (12, 8))
ax = sns.scatterplot(data = pca_df, x = 'pca_1', y = 'pca_2', hue = 'target', style = 'target', s = 100)
plt.show()
다차원 그래프를 pca로 압축한 후 2차원 그래프로 분포가 어떻게 되어있는지 확인할 수 있습니다.
'Machine Learning' 카테고리의 다른 글
[Machine Learning] SMOTETomek (0) | 2022.11.23 |
---|---|
[Machine Learning] imblearn 라이브러리 undersampling (0) | 2022.11.21 |
[Machine Learning] imblearn 라이브러리 oversampling (0) | 2022.11.18 |
[Machin Learning]변수 중요도를 기준으로 Kfold 교차검증 진행하기 (0) | 2022.11.01 |
[Machine Learning]변수 중요도 출력(feature importance) (0) | 2022.11.01 |