๋ณธ ๋ด์ฉ์ ํธ์ฆ์จ ๋จธ์ ๋ฌ๋2 ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ผ๋ฉฐ, ์๋ต๋ ๋ด์ฉ์ด๋ ์ถ๊ฐ๋ ๋ด์ฉ์ด ์์ต๋๋ค.
[8.1] ์ฐจ์์ ์ ์ฃผ
- ํ๋ จ ์ํ ๊ฐ๊ฐ์ด ๋ง์ ํน์ฑ์ ๊ฐ์ง๋๋ฐ ์ด๋ฐ ๋ง์ ํน์ฑ์ ํ๋ จ์ ๋๋ฆฌ๊ฒ ํ ๋ฟ๋ง ์๋๋ผ, ์ข์ ์๋ฃจ์ ์ ์ฐพ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค. ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ข ์ข ์ฐจ์์ ์ ์ฃผ๋ผ๊ณ ํ๋ค.
- ํ๋ จ ์ธํธ์ ์ฐจ์์ด ํด์๋ก ๊ณผ๋์ ํฉ ์ํ์ด ์ปค์ง๋ค.
- ์ฐจ์์ ์ ์ฃผ๋ฅผ ํด๊ฒฐํ๋ ํด๊ฒฐ์ฑ ์ค ํ๋๋ ํ๋ จ ์ํ์ ๋ฐ๋๊ฐ ์ถฉ๋ถํ ๋์์ง ๋๊น์ง ํ๋ จ ์ธํธ์ ํฌ๊ธฐ๋ฅผ ํค์ฐ๋ ๊ฒ
[8.2] ์ฐจ์ ์ถ์๋ฅผ ์ํ ์ ๊ทผ ๋ฐฉ๋ฒ
[8.2.1] ํฌ์
- ๋ชจ๋ ํ๋ จ ์ํ์ด ๊ณ ์ฐจ์ ๊ณต๊ฐ ์์ ์ ์ฐจ์ ๋ถ๋ถ๊ณต๊ฐ์ ๋์ฌ ์๋ค.
- ๋ชจ๋ ์ํ์ด 2์ฐจ์ ๊ณต๊ฐ์ ๊ฐ๊น๊ฒ ๋ฐฐ์น๋์ด ์๋ค.
- ์ ์ฌ์ง์ 2์ฐจ์ ๋ถ๋ถ ๊ณต๊ฐ์ ์์ง์ผ๋ก ํฌ์ํ์ฌ 2D ๋ฐ์ดํฐ์ ์ ์ป์ ์ ์๋ค.
- ์ด๋ฌํ ํฌ์์ด ์ธ์ ๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์๋๋ค. ์ค์์ค ๋กค ๋ฐ์ดํฐ์ ์ฒ๋ผ ๋ถ๋ถ ๊ณต๊ฐ์ด ๋คํ๋ฆฌ๊ฑฐ๋ ํ์ด ์๊ธฐ๋ ํ๋ค.
[8.2.2] ๋งค๋ํด๋ ํ์ต
- ์ค์์ค๋กค์ 2D ๋งค๋ํด๋์ ์์์ด๋ค.
- 2D ๋งค๋ํด๋๋ ๊ณ ์ฐจ์ ๊ณต๊ฐ์์ ํ์ด์ง๊ฑฐ๋ ๋คํ๋ฆฐ 2D ๋ชจ์์ด๋ค.
- ๋ง์ ์ฐจ์ ์ถ์ ์๊ณ ๋ฆฌ์ฆ์ด ํ๋ จ ์ํ์ด ๋์ฌ์๋ ๋งค๋ํด๋๋ฅผ ๋ชจ๋ธ๋งํ๋ ์์ผ๋ก ์๋ํ๋ค. ์ด๋ฅผ ๋งค๋ํด๋ ํ์ต์ด๋ผ๊ณ ํ๋ค.
- ์ด๋ ๋๋ถ๋ถ ์ค์ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์ ์ด ๋ ๋ฎ์ ์ ์ฐจ์ ๋งค๋ํด๋์ ๊ฐ๊น๊ฒ ๋์ฌ ์๋ค๋ ๋งค๋ํด๋ ๊ฐ์ ๋๋ ๋งค๋ํด๋ ๊ฐ์ค์ ๊ทผ๊ฑฐํ๋ค.
* ์์ฝํ์๋ฉด ๋ชจ๋ธ์ ํ๋ จ์ํค๊ธฐ ์ ์ ํ๋ จ ์ธํธ์ ์ฐจ์์ ๊ฐ์์ํค๋ฉด ํ๋ จ ์๋๋ ๋นจ๋ผ์ง์ง๋ง ํญ์ ๋ ๋ซ๊ฑฐ๋ ๊ฐ๋จํ ์๋ฃจ์
์ด ๋๋ ๊ฒ์ ์๋๋ค.
[8.3] PCA
- ์ฃผ์ฑ๋ถ ๋ถ์(PCA)๋ ์ฐจ์ ์ถ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋จผ์ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ดํ๋ฉด์ ์ ์ํ ๋ค์, ๋ฐ์ดํฐ๋ฅผ ์ด ํ๋ฉด์ ํฌ์์ํจ๋ค.
[8.3.1] ๋ถ์ฐ ๋ณด์กด
- ๋จผ์ ์ฌ๋ฐ๋ฅธ ์ดํ๋ฉด์ ์ ํํด์ผํ๋ค.
* ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ํฌ์ํ๋ ๊ฒ๋ณด๋ค ๋ถ์ฐ์ด ์ต๋๋ก ๋ณด์กด๋๋ ์ถ์ ์ ํํ๋ ๊ฒ์ด ์ ๋ณด๊ฐ ๊ฐ์ฅ ์ ๊ฒ ์์ ๋๋ค.
[8.3.2] ์ฃผ์ฑ๋ถ
- PCA๋ ํ๋ จ ์ธํธ์์ ๋ถ์ฐ์ด ์ต๋์ธ ์ถ์ ์ฐพ๋๋ค.
- ํฌ์ํ ์ถ์ ์ฐพ๋ i๋ฒ์งธ ์ถ์ ์ด ๋ฐ์ดํฐ์ i๋ฒ์งธ ์ฃผ์ฑ๋ถ(PC)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ฃผ์ฑ๋ถ์ ์ฐพ๊ธฐ์ํด SVD๋ฅผ ์ด์ฉํ์ฌ ์ฐพ์ ์ ์๋ค.
X_centered = X - X.mean(axis = 0)
U, s, Vt = np.linalg.svd(X_centerd)
c1 = Vt.T[:, 0]
c2 = Vt.T[:, 1]
[8.3.3] d์ฐจ์์ผ๋ก ํฌ์ํ๊ธฐ
- ์ฒซ ๋ ๊ฐ์ ์ฃผ์ฑ๋ถ์ผ๋ก ์ ์๋ ํ๋ฉด์ ํ๋ จ ์ธํธ๋ฅผ ํฌ์ํ๋ค.
W2 = Vt.T[:, :2]
X2D = X_centered.dot(W2)
[8.3.4] ์ฌ์ดํท๋ฐ ์ด์ฉํ๊ธฐ
- ์ฌ์ด์ปท์ PCA ๋ชจ๋ธ์ SVD ๋ถํด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ค.
- ์๋ ์ฝ๋๋ PCA ๋ชจ๋ธ์ ์ฌ์ฉํด ๋ฐ์ดํฐ์ ์ ์ฐจ์์ 2๋ก ์ค์ด๋ ์ฝ๋์ด๋ค.
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
X2D = pca.fit_transfrom(X)
[8.3.5] ์ค๋ช ๋ ๋ถ์ฐ์ ๋น์จ
- explained_variance_ratio_ ๋ณ์์ ์ ์ฅ๋ ์ฃผ์ฑ๋ถ์ ์ค๋ช ๋ ๋ถ์ฐ์ ๋น์จ๋ ์ ์ฉํ ์ ๋ณด๋ก ์ฌ์ฉ๋๋ค.
- ์ด ๋น์จ์ ๊ฐ ์ฃผ์ฑ๋ถ์ ์ถ์ ๋ค๋ผ ์๋ ๋ฐ์ดํฐ์ ์ ๋ถ์ฐ ๋น์จ์ ๋ํ๋ธ๋ค.
pca.explained_variance_ratio_
>>> array([0.84248607, 0.14631839]) # ์ถ๋ ฅ ์์
- ์ด ๋ฐ์ดํฐ์ ๋ถ์ฐ์ 84.2%๊ฐ ์ฒซ ๋ฒ์งธ PC๋ฅผ ๋ฐ๋ผ ๋์ฌ์๊ณ 14,6%๊ฐ ๋ ๋ฒ์งธ PC๋ฅผ ๋ฐ๋ผ ๋์ฌ ์์์ ์ ์ ์๋ค.
[8.3.6] ์ ์ ํ ์ฐจ์ ์ ์ ํํ๊ธฐ
- ์ฝ๋๋ฅผ ํตํด ์ฐจ์์ ์ถ์ํ์ง ์๊ณ PCA๋ฅผ ๊ณ์ฐํ ๋ค ํ๋ จ ์ธํธ์ ๋ถ์ฐ์ 95%๋ก ์ ์งํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ์ฐจ์ ์๋ฅผ ๊ณ์ฐํ๋ค.
pca = PCA()
pca.fit(X_train)
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1
pca = PCA(n_components = 0.95)
X_reduced = pca.fit_transform(X_train)
[8.3.7] ์์ถ์ ์ํ PCA
- ์ฐจ์์ ์ถ์ํ ํ์๋ ํ๋ จ ์ธํธ์ ํฌ๊ธฐ๊ฐ ์ค์ด๋ ๋ค.
- ์๋ณธ ๋ฐ์ดํฐ์ ์ฌ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ(์์ถํ ํ ์๋ณตํ ๊ฒ) ์ฌ์ด์ ํ๊ท ์ ๊ณฑ ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ๊ตฌ์ฑ ์ค์ฐจ ๋ผ๊ณ ํ๋ค.
- ์๋ ์ฝ๋๋ฅผ ํตํด MNIST ๋ฐ์ดํฐ์ ์ 154์ฐจ์์ผ๋ก ์์ถํ๊ณ inverse_transform() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด 784์ฐจ์์ผ๋ก ๋ณต์ํ๋ค.
pca = PCA(n_components = 154)
X_reduced = pca.fit_transform(X_train)
X_recoverd = pca.inverse_transform(X_reduced)
[8.3.8] ๋๋ค PCA
- svd_solver ๋งค๊ฐ๋ณ์๋ฅผ 'randomized'๋ก ์ง์ ํ๋ฉด ์ฌ์ดํท๋ฐ์ ๋๋ค PCA๋ผ ๋ถ๋ฅด๋ ํ๋ฅ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ์ฒ์ d๊ฐ์ ์ฃผ์ฑ๋ถ์ ๋ํ ๊ทผ์ฟ๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๋๋ค.
- d๊ฐ n๋ณด๋ค ๋ง์ด ์์ผ๋ฉด SVD๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ค.
rnd_pca = PCA(n_components=154, svd_solver = 'randomized')
X_reduced = rnd_pca.fit_transfrom(X_train)
[8.3.9] ์ ์ง์ PCA
- ํ๋ จ ์ธํธ๋ฅผ ๋ฏธ๋๋ฐฐ์น๋ก ๋๋ ๋ค IPCA ์๊ณ ๋ฆฌ์ฆ์ ํ ๋ฒ์ ํ๋์ฉ ์ฃผ์ ํ๋ค.
- ์ด๋ฐ ๋ฐฉ์์ ํ๋ จ ์ธํธ๊ฐ ํด ๋ ์ ์ฉํ๊ณ ์จ๋ผ์ธ์ผ๋ก (์ฆ, ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ ๋๋ก ์ค์๊ฐ์ผ๋ก) PCA๋ฅผ ์ ์ฉํ ์๋ ์๋ค.
from sklearn.decomposition import IncrementalPCA
n_batched = 100
inc_pca = IncrementalPCA(n_components = 154)
for X_batch in np.array_split(X_train, n_batched):
inc_pca.partial_fit(X_batch)
X_reduced = inc_pca.transform(X_train)
- IncrementalPCA๋ ํน์ ์๊ฐ์ ๋ฐฐ์ด์ ์ผ๋ถ๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
[8.4] ์ปค๋ PCA
- PCA๋ฅผ ์ ์ฉํด ์ฐจ์ ์ถ์๋ฅผ ์ํ ๋ณต์กํ ๋น์ ํ ํฌํ์ ์ํํ ์ ์๋ค. ์ด๋ฅผ ์ปค๋ PCA๋ผ๊ณ ํ๋ค.
- ์ด ๊ธฐ๋ฒ์ ํฌ์๋ ํ ์ํ์ ๊ตฐ์ง์ ์ ์งํ๊ฑฐ๋ ๊ผฌ์ธ ๋งค๋ํด๋์ ๊ฐ๊น์ด ๋ฐ์ดํฐ์ ์ ํผ์น ๋๋ ์ ์ฉํ๋ค.
from sklearn.decomposition import KernelPCA
rbf_pca = KernelPCA(n_components = 2, kernel = "rbf", gamma = 0.04)
X_reduced = rbf_pca.fit_transform(X)
[8.4.1] ์ปค๋ ์ ํ๊ณผ ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋
- kPCA๋ ๋น์ง๋ ํ์ต์ด๊ธฐ ๋๋ฌธ์ ๋ช ํํ ์ฑ๋ฅ ์ธก์ ๊ธฐ์ค์ด ์๋ค.
- ๋ค์ ์ฝ๋๋ ๋ ๋จ๊ณ์ ํ์ดํ๋ผ์ธ์ ๋ง๋๋๋ฐ, ๋จผ์ kPCA๋ฅผ ์ฌ์ฉํด ์ฐจ์์ 2์ฐจ์์ผ๋ก ์ถ์ํ๊ณ ๋ถ๋ฅ๋ฅผ ์ํด ๋ก์ง์คํฑ ํ๊ท๋ฅผ ์ ์ฉํ๋ค. ๊ทธ๋ฐ ๋ค์ ํ์ดํ๋ผ์ธ ๋ง์ง๋ง ๋จ๊ณ์์ ๊ฐ์ฅ ๋์ ๋ถ๋ฅ ์ ํ๋๋ฅผ ์ป๊ธฐ ์ํด GridSearchCV๋ฅผ ์ฌ์ฉํด kPCA์ ๊ฐ์ฅ ์ข์ ์ปค๋๊ณผ gamma ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ๋๋ค.
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
clf = Pipeline([
("kpca", KernelPCA(n_components = 2)),
("log_reg", LogisticRegression())
])
param_grid = [{
"kpca__gamma" : np.linspace(0.03, 0.05, 10),
"kpca__kernel" : ["rbf", "sigmoid"]
}]
grid_search = GridSearchCV(clf, param_grid, cv=3)
grid_search.fit(X, y)
>>> print(grid_search.best_params_)
{'kpca__gamma': 0.043333333333333335, 'kpca__kernel': 'rbf'}
- ์ฐจ์ ์ถ์ ํ ๋ค์ ์๋ณธ์ผ๋ก ์ญ์ ์ํค๋ฉด ์๋ณธ ๊ณต๊ฐ์ผ๋ก ๋์๊ฐ๋๊ฐ? ์๋๋ค. ํน์ฑ ๊ณต๊ฐ(๋ฌดํ ์ฐจ์)์ ๋์ด๊ฒ ๋๋ค. ์๋ณธ ๊ณต๊ฐ์ ํฌ์ธํธ๋ฅผ ์ฐพ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋๊ฐ? ์ฌ๊ตฌ์ฑ ์์์ ํตํด ์ฌ๊ตฌ์ฑ๋ ํฌ์ธํธ์ ๊ฐ๊น๊ฒ ๋งคํ๋ ์๋ณธ ๊ณต๊ฐ์ ํฌ์ธํธ๋ฅผ ์ฐพ์ ์ ์๋ค.
- ์ง๋ํ์ต ํ๊ท๋ชจ๋ธ์ ํตํด train : ํฌ์๋ ์ํ, target : ์๋ณธ ์ํ
- fit_inverse_transform=True๋ฅผ ํตํด ์๋์ผ๋ก ์ํ
rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.0433, fit_inverse_transform=True)
X_reduced = rbf_pca.fit_transform(X)
X_preimage = rbf_pca.inverse_transform(X_reduced)
- ๊ทธ๋ฐ ๋ค์ ์ฌ๊ตฌ์ฑ ์์ ์ค์ฐจ๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
from sklearn.metrics import mean_squared_error
mean_squared_error(X, X_preimage)
>>> 32.78630879
[8.6] ๋ค๋ฅธ ์ฐจ์ ์ถ์ ๊ธฐ๋ฒ
- ๋๋ค ํฌ์
- ๋ค์ฐจ์ ์ค์ผ์ผ๋ง
- Isomap
- t-SNE
'AI > Machine Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 10 ์์ฝ (0) | 2022.12.08 |
---|---|
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 5 ์์ฝ (0) | 2022.11.29 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 4 ์์ฝ (1) | 2022.10.27 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 3 ์์ฝ (0) | 2022.10.26 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 3์ฅ ์ฐ์ต๋ฌธ์ ํ์ด (0) | 2022.10.23 |