์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- LDA
- Lambda
- ํ ์คํธ๋ถ์
- ๋น ๋ฐ์ดํฐ๋ถ์๊ธฐ์ฌ
- ํฌ๋กค๋ง
- ์ค๋ฒ์ํ๋ง
- datascience
- numpy
- t-test
- ๋ฐ์ดํฐ๋ถ์์ ๋ฌธ๊ฐ
- ๋ ๋ฆฝํ๋ณธ
- pandas
- opencv
- ์ฃผ์ฑ๋ถ๋ถ์
- ๋ฐ์ดํฐ๋ถ๊ท ํ
- ์๋ํด๋ผ์ฐ๋
- PCA
- Python
- ๋ฐ์ดํฐ๋ถ์
- ๋์ํ๋ณธ
- ๋ฐ์ดํฐ๋ถ์์ค์ ๋ฌธ๊ฐ
- dataframe
- ๊ตฐ์งํ
- ์ธ๋์ํ๋ง
- ํ์ด์ฌ
- ADsP
- ๋น ๋ฐ์ดํฐ
- DBSCAN
- iloc
- ADP
Data Science LAB
[Python] PCA(Principal Component Analysis) ๋ณธ๋ฌธ
[Python] PCA(Principal Component Analysis)
ใ ใ ใ ใ 2022. 3. 5. 19:47PCA ๊ฐ์
PCA(Principal Component Analysis)๋ ๊ฐ์ฅ ๋ํ์ ์ธ ์ฐจ์ ์ถ์ ๊ธฐ๋ฒ์ผ๋ก ์ฌ๋ฌ ๋ณ์ ๊ฐ์ ์กด์ฌํ๋ ์๊ด๊ด๊ณ๋ฅผ ์ด์ฉํด ์ด๋ฅผ ๋ํํ๋ ์ฃผ์ฑ๋ถ(Principal Component)๋ฅผ ์ถ์ถํด ์ฐจ์์ ์ถ์ํ๋ ๊ธฐ๋ฒ์ด๋ค. PCA ์ฐจ์ ์ถ์๋ก ์ธํ ์ ๋ณด ์ ์ค์ ์ต์ํํ๊ธฐ ์ํด ๊ฐ์ฅ ๋์ ๋ถ์ฐ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ์ ์ถ์ ์ฐพ์ ์ด ์ถ์ผ๋ก ์ฐจ์์ ์ถ์ํ๋ค. ์ด๊ฒ์ด PCA์ ์ฃผ์ฑ๋ถ์ด ๋๋๋ฐ, ๋ถ์ฐ์ด ๋ฐ์ดํฐ์ ํน์ฑ์ ๊ฐ์ฅ ์ ๋ํ๋ด๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ฐ์ดํฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ดํ๋ฉด์ ์ ์ํ๊ณ , ์ด ์ดํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ํฌ์์ํค๋ ๊ฒ์ด๋ค.
ํฌ์์์ผฐ์ ๋ ๋ฐ์ดํฐ์ ๊ณผ์ ํ๊ท ์ ๊ณฑ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์์ ์ดํ๋ฉด์ ์ฐพ๊ณ ํฌ์ ์ํค๋ ๊ณผ์ ์ ๊ทธ๋ฆผ์ ๋ํ๋ด์๋ค.
PCA๋ ์ ์ผ ๋จผ์ ๊ฐ์ฅ ๋ฐ์ดํฐ ๋ณ๋์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ฒซ ๋ฒ์งธ ๋ฒกํฐ ์ถ์ ์์ฑํ๊ณ , ๋ ๋ฒ์งธ ์ถ์ ์ด ๋ฒกํฐ ์ถ์ ์ง๊ฐ์ด ๋๋ ๋ฒกํฐ๋ฅผ ์ถ์ผ๋ก ํ๋ค. ์ธ ๋ฒ์งธ ์ถ์ ๋ ๋ฒ์งธ ์ถ๊ณผ ์ง๊ฐ์ด ๋๋ ๋ฒกํฐ๋ฅผ ์ค์ ํ๋ ๋ฐฉ์์ผ๋ก ์ถ์ ์์ฑํ๋ค. ์ด๋ ๊ฒ ์์ฑ๋ ๋ฒกํฐ ์ถ์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ํฌ์ํ๋ฉด ๋ฒกํฐ ์ถ์ ๊ฐ์๋งํผ์ ์ฐจ์์ผ๋ก ์๋ณธ ๋ฐ์ดํฐ๊ฐ ์ฐจ์ ์ถ์๋๋ค. ์ฆ, ์๋ณธ ๋ฐ์ดํฐ์ ํผ์ฒ ๊ฐ์์ ๋นํด ๋งค์ฐ ์์ ์ฃผ์ฑ๋ถ์ผ๋ก ์๋ณธ ๋ฐ์ดํฐ์ ์ด ๋ณ๋์ฑ์ ๋๋ถ๋ถ ์ค๋ช ํ ์ ์๋ ๋ถ์๋ฒ์ด๋ค.
์ ํ๋์ ๊ด์ ์์ ํด์ํด ๋ณด๋ฉด, ์ ๋ ฅ ๋ฐ์ดํฐ์ ๊ณต๋ถ์ฐ ํ๋ ฌ(Covariance Matix)์ ๊ณ ์ ๊ฐ ๋ถํดํ๊ณ , ์ด๋ ๊ฒ ๊ตฌํ ๊ณ ์ ๋ฒกํฐ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ํ ๋ณํํ๋ ๊ฒ์ด๋ค. ์ด ๊ณ ์ ๋ฒกํฐ๊ฐ PCA์ ์ฃผ์ฑ๋ถ ๋ฒกํฐ๋ก์ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ถ์ฐ์ด ํฐ ๋ฐฉํฅ์ ๋ํ๋ธ๋ค. ๊ณ ์ ๊ฐ(eigenvalue)์ ๋ฐ๋ก ์ด ๊ณ ์ ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ๋์์ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ถ์ฐ์ ๋ํ๋ธ๋ค.
๋ณดํต ๋ถ์ฐ์ ํ ๊ฐ์ ํน์ ํ ๋ณ์์ ๋ฐ์ดํฐ ๋ณ๋์ ์๋ฏธํ์ง๋ง, ๊ณต๋ถ์ฐ์ ๋ ๋ณ์ ๊ฐ์ ๋ณ๋์ ์๋ฏธํ๋ค. ๊ณต๋ถ์ฐ ํ๋ ฌ์ ์ฌ๋ฌ ๋ณ์์ ๊ด๋ จ๋ ๊ณต๋ถ์ฐ์ ํฌํจํ๋ ์ ๋ฐฉํ ํ๋ ฌ์ด๋ค.
X | Y | Z | |
X | 3 | -0.71 | -0.24 |
Y | -0.71 | 4.5 | 0.28 |
Z | -0.24 | 0.28 | 0.91 |
์์ ํ ๊ณต๋ถ์ฐ ํ๋ ฌ์์ ๋๊ฐ์ ์์๋ ๊ฐ ๋ณ์(X,Y,Z)์ ๋ถ์ฐ์ ์๋ฏธํ๋ฉฐ, ๋๊ฐ์ ์ด์ธ์ ์์๋ ๊ฐ๋ฅํ ๋ชจ๋ ๋ณ์ ์ ๊ฐ์ ๊ณต๋ถ์ฐ์ ์๋ฏธํ๋ค. X,Y,Z์ ๋ถ์ฐ์ ๊ฐ๊ฐ 3, 4.5,0.91์ด๋ฉฐ X์ Y์ ๊ณต๋ถ์ฐ์ -0.71, X์ Z์ ๊ณต๋ถ์ฐ์ 0.91, Y์ Z์ ๊ณต๋ถ์ฐ์ 0.28์ด๋ค.
๊ณ ์ ๋ฒกํฐ๋ ํ๋ ฌ A๋ฅผ ๊ณฑํ์ฌ๋ ๋ฐฉํฅ์ด ๋ณํ์ง ์๊ณ ํฌ๊ธฐ๋ง ๋ณํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฆ, Ax = ax(A๋ ํ๋ ฌ, x๋ ๊ณ ์ ๋ฒกํฐ, a๋ ์ค์นผ๋ผ ๊ฐ)์ด๋ค. ์ด ๊ณ ์ ๋ฒกํฐ๋ ์ฌ๋ฌ๊ฐ๊ฐ ์กด์ฌํ๋ฉฐ, ์ ๋ฐฉ ํ๋ ฌ์ ์ต๋ ๊ทธ ์ฐจ์ ์ ๋งํผ์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ๊ฐ์ง ์ ์๋ค. ๊ณต๋ถ์ฐ ํ๋ ฌ์ ์ ๋ฐฉํ๋ ฌ ์ด๋ฉฐ ๋์นญํ๋ ฌ์ด๋ค. ์ ๋ฐฉํ๋ ฌ์ ์ด๊ณผ ํ์ด ๊ฐ์ ํ๋ ฌ์ ์ง์นญํ๋ฉฐ, ์ ๋ฐฉํ๋ ฌ ์ค์์ ๋๊ฐ ์์๋ฅผ ์ค์ฌ์ผ๋ก ์์ ๊ฐ์ด ๋์นญ๋๋ ํ๋ ฌ์ ๋์นญํ๋ ฌ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ฐ๋ณ ๋ถ์ฐ ๊ฐ์ ๋๊ฐ ์์๋ก ํ๋ ๋์นญ ํ๋ ฌ์ด๋ฉฐ ํญ์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ง๊ตํ๋ ฌ๋ก, ๊ณ ์ ๊ฐ์ ์ ๋ฐฉ ํ๋ ฌ๋ก ๋๊ฐํํ ์ ์๋ค.
ei๋ i๋ฒ์งธ ๊ณ ์ ๋ฒกํฐ, λ๋ ๊ณ ์ ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ค.
e1์ ๊ฐ์ฅ ๋ถ์ฐ์ด ํฐ ๋ฐฉํฅ์ ๊ฐ์ง ๊ณ ์ ๋ฒกํฐ์ด๋ฉฐ, e2๋ e1์ ์์ง์ด๋ฉด์ ๋ค์์ผ๋ก ๊ฐ์ฅ ๋ถ์ฐ์ด ํฐ ๋ฐฉํฅ์ ๊ฐ์ง ๊ณ ์ ๋ฒกํฐ์ด๋ค.
์ฆ, ์ ๋ ฅ ๋ฐ์ดํฐ์ ๊ณต๋ถ์ฐ ํ๋ ฌ์ด ๊ณ ์ ๋ฒกํฐ์ ๊ณ ์ ๊ฐ์ผ๋ก ๋ถํด๋ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ฒ ๋ถํด๋ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ด์ฉํด ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ํ ๋ณํํ๋ ๋ฐฉ์์ด PCA์ด๋ค.
1. ์ ๋ ฅ ๋ฐ์ดํฐ ์ ์ ๊ณต๋ถ์ฐ ํ๋ ฌ ์์ฑ
2. ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ ์ ๋ฒกํฐ์ ๊ณ ์ ๊ฐ ๊ณ์ฐ
3. ๊ณ ์ ๊ฐ์ด ํฐ ์์ผ๋ก K๊ฐ(PCA ๋ณํ ์ฐจ์)๋งํผ ๊ณ ์ ๋ฒกํฐ ์ถ์ถ
4. ๊ณ ์ ๊ฐ์ด ํฐ ์์ผ๋ก ์ถ์ถ๋ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ด์ฉํด ์๋กญ๊ฒ ์ ๋ ฅ ๋ฐ์ดํฐ ๋ณํ
์์ ์์๋๋ก PCA๋ฅผ ์งํํ๋ค.
์์
4๊ฐ์ ์์ฑ์ผ๋ก ์ด๋ฃจ์ด์ง iris ๋ฐ์ดํฐ๋ฅผ 2๊ฐ์ ์ฐจ์์ผ๋ก ์์ถ
๋ฐ์ดํฐ ๋ก๋ฉ
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
iris = load_iris()
columns = ['sepal_length','sepal_width','petal_length','petal_width']
iris_df = pd.DataFrame(iris.data,columns=columns)
iris_df['target'] = iris.target
iris_df.head()
2์ฐจ์์ผ๋ก ํ์ข ๋ฐ์ดํฐ ๋ถํฌ ํ์ธ
markers=['^','s','o']
#setosa์ target๊ฐ์ 0, versicolor๋ 1, virginica๋2
#๊ฐ ํ๊ฒ๋ณ๋ก ๋ค๋ฅธ๋ชจ์์ผ๋ก ํ์
for i,marker in enumerate(markers):
x_axis_data = iris_df[iris_df['target'] == i]['sepal_length']
y_axis_data = iris_df[iris_df['target'] == i]['sepal_width']
plt.scatter(x_axis_data,y_axis_data,marker = marker, label = iris.target_names[i])
plt.legend()
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.show()
๊ฐ ํ์ข ์ ๋ฐ๋ผ ์๋ณธ ๋ถ๊ฝ ๋ฐ์ดํฐ์ ์ด ์ด๋ป๊ฒ ๋ถํฌ๋์ด ์๋์ง 2์ฐจ์์ผ๋ก ์๊ฐํ
StandardScaler๋ก ์ค์ผ์ผ ๋ณํ
from sklearn.preprocessing import StandardScaler
iris_scaled = StandardScaler().fit_transform(iris_df.iloc[:,:-1])
PCA๋ ์ฌ๋ฌ ์์ฑ์ ๊ฐ์ ์ฐ์ฐํด์ผ ํ๋ฏ๋ก ์์ฑ์ ์ค์ผ์ผ์ ์ํฅ์ ๋ฐ๋๋ค. ๋ฐ๋ผ์ PCA ์์ถ ์ ์ ๊ฐ ์์ฑ๊ฐ์ ๋์ผํ ์ค์ผ์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
2์ฐจ์์ PCA๋ฐ์ดํฐ๋ก ๋ณํ
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
iris_pca = pca.fit_transform(iris_scaled)
print(iris_pca.shape)
2์ฐจ์์ผ๋ก ๋ณํํ๊ณ ์ ํ๋ฏ๋ก n_components = 2๋ก ์ค์ ํ์๋ค.
pca ๋ณํ๋ ๋ฐ์ดํฐ์ ์ปฌ๋ผ ๋ช ์ ๊ฐ๊ฐ pca_component1,2๋ก ๋ช ๋ช
pca_columns = ['pca_component_1','pca_component_2']
iris_df_pca = pd.DataFrame(iris_pca,columns=pca_columns)
iris_df_pca['target'] = iris.target
iris_df_pca.head()
2๊ฐ ์์ฑ์ผ๋ก ๋ณํ๋ ๋ฐ์ดํฐ์ 2์ฐจ์์์ ์๊ฐํ
markers = ['^','s','o']
#pca_compontent_1์ด x์ถ, pca_component_2๊ฐ y์ถ
for i, marker in enumerate(markers):
x_axis_data = iris_df_pca[iris_df_pca['target'] == i]['pca_component_1']
y_axis_data = iris_df_pca[iris_df_pca['target'] == i]['pca_component_2']
plt.scatter(x_axis_data,y_axis_data,marker=marker,label = iris.target_names[i])
plt.legend()
plt.xlabel('pca_component_1')
plt.ylabel('pca_component_2')
plt.show()
๋ถ์์ ํธ๋ฆฌํ๊ฒ ํ๊ธฐ ์ํด์ PCA ๋ฐ์ดํฐํ๋ ์์ ๋ฐ๋ก ์์ฑํ์ฌ, ์ฃผ์ฑ๋ถ1, ์ฃผ์ฑ๋ถ2, ํ๊น ์ปฌ๋ผ์ผ๋ก ๊ตฌ์ฑํ์๋ค.
์ ์ฒด ๋ณ๋์ฑ์์ ๊ฐ๋ณ PCA ์ปดํฌ๋ํธ๋ณ๋ก ์ฐจ์งํ๋ ๋ณ๋์ฑ ๋น์จ ์ ๊ณต
print(pca.explained_variance_ratio_)
explained_variance_ration_์์ฑ์ ์ ์ฒด ๋ณ๋์ฑ์์ ๊ฐ๋ณ PCA ์ปดํฌ๋ํธ ๋ณ๋ก ์ฐจ์งํ๋ ๋ณ๋์ฑ ๋น์จ์ ์ ๊ณตํ๋ค.
์ฒซ ๋ฒ์งธ PCA ๋ณํ ์์์ธ pca_component_1์ ์ ์ฒด ๋ณ๋์ฑ์ ์ฝ 72.9%๋ฅผ ์ฐจ์งํ๋ฉฐ ๋ ๋ฒ์งธ์ธ pca_component_2๋ ์ฝ 22.8%๋ฅผ ์ฐจ์งํ๋ค. ๋ฐ๋ผ์ PCA๋ฅผ 2๊ฐ ์์๋ก๋ง ์์ถํ์ฌ๋ ์๋ณธ ๋ฐ์ดํฐ์ ์ฝ 95%๋ฅผ ์ค๋ช ํ ์ ์๋ค.
๋๋คํฌ๋ ์คํธ ์ ์ฉ
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
rf = RandomForestClassifier(random_state = 156)
scores = cross_val_score(rf,iris.data,iris.target,scoring='accuracy',cv=3)
print('์๋ณธ ๋ฐ์ดํฐ ๊ต์ฐจ ๊ฒ์ฆ ์ ํ๋ : ',scores)
print('์๋ณธ ๋ฐ์ดํฐ ํ๊ท ์ ํ๋ : ',np.mean(scores))
#2์ฐจ์ PCA ๋ณํ ๋ฐ์ดํฐ์
์ ์ ์ฉ
pca_X = iris_df_pca[['pca_component_1','pca_component_2']]
scores_pca = cross_val_score(rf,pca_X,iris.target,scoring='accuracy',cv=3)
print('PCA ๋ณํ ๋ฐ์ดํฐ ๊ต์ฐจ ๊ฒ์ฆ ์ ํ๋ : ',scores_pca)
print('PCA ๋ณํ ๋ฐ์ดํฐ ํ๊ท ์ ํ๋ : ',np.mean(scores_pca))
์๋ณธ ๋ฐ์ดํฐ์ ๋๋น ์์ธก ์ ํ๋๋ PCA ๋ณํ ์ฐจ์ ๊ฐ์์ ๋ฐ๋ผ ์์ธก ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ๋ฐ์ ์๋ค. 4๊ฐ์ ์์ฑ์ด 2๊ฐ์ ๋ณํ ์์ฑ์ผ๋ก ๊ฐ์ํ๋ฉด์ ์์ธก ์ฑ๋ฅ์ ์ ํ๋๊ฐ 10%ํ๋ฝํ์๋ค. 4๊ฐ์ ์์ฑ์์ 2๊ฐ์ ์์ฑ์ผ๋ก 50%๊ฐ์ํ ๊ฒ์ ๊ฐ์ํ๋ฉด, ์ ํ๋๋ฅผ ์๋นํ ์ ์ ์งํ๊ณ ์๋ค๊ณ ํ ์ ์๋ค.
'๐ Machine Learning > ์ฐจ์ ์ถ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python]NMF (0) | 2022.03.08 |
---|---|
[Python] SVD(Singular Value Decomposition) (0) | 2022.03.07 |
[Python] LDA(Linear Discriminant Analysis) (0) | 2022.03.07 |
[Python] PCA ์์ (0) | 2022.03.06 |