๋จธ์ ๋ฌ๋์ ๋ง์ ๋ฌธ์ ๋ train sample ์ด ์์ฒ์์ ์๋ฐฑ๋ง๊ฐ์ ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๋์ 3์ฐจ์ ๊ณต๊ฐ์์ ์ด๊ณ ์๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋ณด๊ณ ๋๋ ์ ์๋ ๊ฒ๋ค์ 1,2,3์ฐจ์ ์ ๋๋ค. ํ์ง๋ง ๋จธ์ ๋ฌ๋์์๋ ๋ค๋ฃจ๋ ์ฐจ์์ ์๊ฐ ์ ๋ง ํฝ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋งค์ฐ ๊ฐ๋จํ ํํ์ด๋๋ผ๋ ์ฐจ์์ ์๊ฐ ๋์์ง๋ฉด ์ดํดํ ์ ์์ด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ ํน์ฑ์ triain ์๊ฐ์ ๋๋ฆฌ๊ฒ ํ ๋ฟ๋ง์๋๋ผ, ์ข์ ์๋ฃจ์ ์ ์ฐพ๊ธฐ ํ๋ค๊ฒ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ข ์ข ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ฐจ์์ ์ ์ฃผ(CURSE OF DIMENSIONALITY)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
ํ์ง๋ง ํน์ฑ ์๋ฅผ ํฌ๊ฒ ์ค์ฌ ๊ณ ์ฐจ์ ๊ณต๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์ดํดํ ์ ์๋ ์ ์ฐจ์์ผ๋ก ๋ณํํ๋ ๊ธฐ์ ์ ์ฐ๊ตฌํ์์ต๋๋ค. ์ด๋ฅผ dimensionality reduction์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด MNIST ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด, ์ด๋ฏธ์ง ๊ฒฝ๊ณ์ ์๋ ํฝ์ ์ ํฐ์์ด๋ฏ๋ก ์ด๋ฐ ํฝ์ ์ ์์ ํ ์ ๊ฑฐํด๋ ๋ง์ ์ ๋ณด๋ฅผ ์์ง๋ ์์ต๋๋ค.
์ฐจ์์ ์ถ์์์ผ ์ผ๋ถ ์ ๋ณด๋ฅผ ์์ค๋ค๋ฉด ํ๋ จ์๋๊ฐ ๋นจ๋ผ์ง๋ ๊ฒ ์ธ์ ๋ฐ์ดํฐ ์๊ฐํ์๋ ์์ฃผ ์ ์ฉํ๊ฒ ์ฐ์ผ ์ ์์ต๋๋ค. ์ฐจ์ ์๋ฅผ ๋์ด๋ ์ ์ผ๋ก ์ค์ด๋ฉด ํ๋์ ์์ถ๋ ๊ทธ๋ํ๋ก ๊ทธ๋ฆด ์ ์๊ณ ๊ตฐ์ง๊ฐ์ ์๊ฐ์ ์ธ ํจํด์ ๊ฐ์งํด ์ธ์ฌ์ดํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ฐจ์ ์ถ์ ๊ธฐ๋ฒ์ ํฌ์projection ๊ณผ ๋งค๋ํด๋ ํ์ตmanifold learning, ๊ฐ์ฅ ์ธ๊ธฐ์๋ PCA๊ฐ ์์ต๋๋ค.
PCA(์ฃผ์ฑ๋ถ ๋ถ์)
๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ฐจ์ ์ถ์ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
์ฌ์ดํท๋ฐ์ PCA - SVD ๋ถํด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค.
MNIST๋ ๊ฐ์ฅ ๊ฐ๋จํ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ์ ๋๋ค. ์ด๊ฒ์ 28 x 28 pixel ์ ์ซ์ ์ด๋ฏธ์ง๋ก ๊ตฌ์ฑ๋์ด์์ต๋๋ค. ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฏธ์ง์ ๊ทธ ์ซ์๊ฐ ๋ฌด์์ธ์ง๋ฅผ ์๋ ค์ฃผ๋ label๋ก ๋๋ ์ฃผ๊ฒ ์ต๋๋ค. ๊ฐ๊ฐ์ ์ด๋ฏธ์ง๋ 28 x 28 pixel๋ค์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ 28×28=784 ์ฐจ์์ ๋ฒกํฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง 784์ฐจ์์ ๊ณต๊ฐ์์ ์ฐ๋ฆฌ์ MNIST ๊ฐ ์ฐจ์งํ๋ ๊ณต๊ฐ์ ๋งค์ฐ ์์ ๊ฒ์ ๋๋ค. 784 ์ฐจ์์๋ ๋งค์ฐ๋งค์ฐ ๋ง์ ๋ฒกํฐ๋ค์ด ์กด์ฌํฉ๋๋ค.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', cache=False)
X = mnist.data.astype('float32').to_numpy()
y = mnist.target.astype('int64').to_numpy()
PCA ๋ Principal Components Analysis ์ ์ฝ์๋ก, ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ํฉ์ด์ ธ์๋ ์ถ์ ์ฐพ์์ ๊ทธ๊ณณ์ผ๋ก ์ฌ์ํด์ ์ํ๋ ์ฐจ์ ๊ฐ์๋งํผ ์ค์ด๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ํฉ์ด์ ธ์๋ ์ถ์ด๋ผ๋ ๋ง์ ๊ฐ์ฅ variance ๊ฐ ์ปค์ง๊ฒ ํ๋ ์ถ์ด๋ผ๋ ๋ง๊ณผ ๊ฐ์ต๋๋ค.
PCA๋ฅผ scikit-learn ํจํค์ง๋ฅผ ํ์ฉํด์ ๋ํ๋ด๋ฉด์ ์ดํดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. 42000๊ฐ์ ๋ฐ์ดํฐ๋ ๊ฐ์๊ฐ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ๊ฐ์๋ฅผ ์ข ์ค์ฌ์ 15000๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์งํํ๊ฒ ์ต๋๋ค.
labels = y[:15000]
data = X[:15000]
print("the shape of sample data = ", data.shape)
๊ทธ๋ฆฌ๊ณ feature์ ๊ฐ์๊ฐ ๋งค์ฐ ๋ง์ด ๋๋ฌธ์ ์ ๊ทํ๋ฅผ ์์ผ์ค๋๋ค. Sklearn ํจํค์ง ์์ StandardScaler ํจ์๋ฅผ ํตํด์ z-score ์ ๊ทํ๋ฅผ ์์ผ์ฃผ๊ฒ ์ต๋๋ค
from sklearn.preprocessing import StandardScaler
standardized_data = StandardScaler().fit_transform(data)
print(standardized_data.shape)
sample_data = standardized_data
2์ฐจ์์ผ๋ก ์ถ์๋ฅผ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ number of components๋ฅผ 2๋ก ํด์ฃผ๊ฒ ์ต๋๋ค.
from sklearn import decomposition
pca = decomposition.PCA()
# configuring the parameteres
# the number of components = 2
pca.n_components = 2
pca_data = pca.fit_transform(sample_data)
# pca_reduced will contain the 2-d projects of simple data
print("shape of pca_reduced.shape = ", pca_data.shape)
์๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ 784์ฐจ์์ด์๋๋ฐ PCA๋ฅผ ํตํด์ 2๋ก ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด์ ์ด๊ฒ์ ์๊ฐํํด์ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ผ๋ฒจ๋ง๋ค ์์ ๋ถ์ฌํด์ ์๊ฐํํ๊ฒ ์ต๋๋ค.
# attaching the label for each 2-d data point
pca_data = np.vstack((pca_data.T, labels)).T
import seaborn as sn
# creating a new data fram which help us in ploting the result data
pca_df = pd.DataFrame(data=pca_data, columns=("1st_principal", "2nd_principal", "label"))
sn.FacetGrid(pca_df, hue="label", size=6).map(plt.scatter, '1st_principal', '2nd_principal').add_legend()
plt.show()
์ด๋ ๊ฒ ์ฐ๋ฆฌ์ MNIST ๋ฐ์ดํฐ์ ์ 2D๋ก ์ฐจ์์ ์ถ์ํด์ ์๊ฐํ๋ฅผ ํด๋ณด์์ต๋๋ค. ๋น์ทํ ๋ผ๋ฒจ์ ์ด๋ฏธ์ง๋ค๋ผ๋ฆฌ ๋ชจ์ฌ์๋ ๊ฒ์ ๋ณด์ ์ ์ถ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
'๋จธ์ ๋ฌ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ง๋ํ์ต - ๊ตฐ์ง, k-means, ์ค๋ฃจ์ฃ์ ์ ์ฌ์ดํท๋ฐ (0) | 2022.12.07 |
---|---|
๋จธ์ ๋ฌ๋ ๋ถ๋ฅ ์ฑ๋ฅ ์ธก์ (0) | 2022.12.06 |
๋ค์ค ๋ก์ง์คํฑ ํ๊ท (์ํํธ๋งฅ์ค ํ๊ท) (0) | 2022.12.05 |
๋ก์ง์คํฑ ํ๊ท sklearn logistic regression iris python (0) | 2022.12.04 |
[๋จธ์ ๋ฌ๋4] Logistic Regression ๋ก์ง์คํฑ ํ๊ท pyhton (0) | 2022.11.30 |