from sklearn.preprocessing import StandardScaler, Normalizer
from sklearn.decomposition import PCA
fit() : ํ๊ท ๐๊ณผ ํ์คํธ์ฐจ ๐๋ฅผ ๊ณ์ฐ
transform() : โ์ ๊ทํ/ํ์คํ, Standardization
fit_trasform() : fit() + transform()
fit() -๋ฐ์ดํฐ๋ฅผ ํ์ต์ํค๋ ๋ฉ์๋
transform() - ํ์ต์ํจ ๊ฒ์ ์ ์ฉํ๋ ๋ฉ์๋
So, Test data set์๋ ์ ์ฉํ๋ฉด ์๋จ!
= sclaer๊ฐ ๊ธฐ์กด์ ํ์ต ๋ฐ์ดํฐ์ fitํ ๊ธฐ์ค์ ๋ค ๋ฌด์ํ๊ณ ํ ์คํธ ๋ฐ์ดํฐ์ ์๋ก์ด mean, variance๊ฐ์ ์ป์ผ๋ฉด์ ํ ์คํธ ๋ฐ์ดํฐ๊น์ง ํ์ตํด๋ฒ๋ฆฐ๋ค. ํ ์คํธ ๋ฐ์ดํฐ๋ ๊ฒ์ฆ์ ์ํด ๋จ๊ฒจ๋ Set
๊ณ ์ ๋ฒกํฐ (Eigenvector) ๊ณ ์ ๊ฐ (Eigenvalue)
๊ณ ์ ๋ฒกํฐ๋ ์ฃผ์ด์ง transformation์ ๋ํด์ ํฌ๊ธฐ๋ง ๋ณํ๊ณ ๋ฐฉํฅ์ ๋ณํ ํ์ง ์๋ ๋ฒกํฐ
์ฌ๊ธฐ์ ๋ณํํ๋ ํฌ๊ธฐ๋ ๊ฒฐ๊ตญ ์ค์นผ๋ผ ๊ฐ์ผ๋ก ๋ณํ ํ ์ ๋ฐ์ ์๋๋ฐ, ์ด ํน์ ์ค์นผ๋ผ ๊ฐ์ ๊ณ ์ ๊ฐ (eigenvalue)
# ๊ณ ์ ๊ฐ์ ๊ณ ์ ๋ฒกํฐ ๋ฐฉํฅ์ผ๋ก ์ผ๋ง๋งํผ์ ํฌ๊ธฐ๋ก ๋ฒกํฐ๊ณต๊ฐ์ด ๋๋ ค์ง๋ ์ง๋ฅผ ์๊ธฐํ๋ค
== ์๋ฅผ ๋ค์ด ์ง๊ตฌ์ ์์ ์ด๋๊ณผ ๊ฐ์ด 3์ฐจ์ ํ์ ๋ณํ์ ์๊ฐํ์ ๋, ์ด ํ์ ๋ณํ์ ์ํด ๋ณํ์ง
์๋ ๊ณ ์ ๋ฒกํฐ๋ ํ์ ์ถ ๋ฒกํฐ์ด๊ณ ๊ทธ ๊ณ ์ ๊ฐ์ 1์ด ๋ ๊ฒ์ด๋ค.
- transformation์ ์ํฅ์ ๋ฐ์ง ์๋ ํ์ ์ถ, (ํน์ ๋ฒกํฐ)
(= ๋ถ์ฐ์ ๋ฐฉํฅ์ ์๋ ค์ค)
- ๋ณํํ๋ ํฌ๊ธฐ๋ ๊ฒฐ๊ตญ ์ค์นผ๋ผ ๊ฐ์ผ๋ก ๋ณํ ํ ์ ๋ฐ์ ์๋๋ฐ, ์ด ํน์ ์ค์นผ๋ผ ๊ฐ์ ๊ณ ์ ๊ฐ
(= ์ค๋ช ๊ฐ๋ฅํ ๋ถ์ฐ๋)
*Vector transformation์ ๊ฒฐ๊ตญ ๊ถ๊ทน์ ์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ค
https://angeloyeo.github.io/2019/07/17/eigen_vector.html
๊ณ ์ณ๊ฐ๊ณผ ๊ณ ์ ๋ฒกํฐ - ๊ณต๋์ด์ ์ํ์ ๋ฆฌ๋ ธํธ
angeloyeo.github.io
np.linalg.norm / inv / eig ## ๋ฒกํฐ์ ํฌ๊ธฐ(lVl), ์ญํ๋ ฌ, ๊ณ ์ ๊ฐ๊ณผ ๋ฒกํฐ
( value, vector = np.linalg.eig() )
np.dot/ matmul ## ๋ ๋ฒกํฐ์ ๋ด์ ์ฃผ์) 2์ฐจ์์์๋ ๊ฐ์ง๋ง 3์ฐจ์๋ถํฐ๋ ๊ฐ์ด๋ค๋ฆ
np.multiply ## ๊ณฑ(=์ค์นผ๋ผ)
Explained Variance Ratio์ ๊ฐ๊ฐ์ ์ฃผ์ฑ๋ถ ๋ฒกํฐ๊ฐ ์ด๋ฃจ๋ ์ถ์
ํฌ์(projection)ํ ๊ฒฐ๊ณผ์ ๋ถ์ฐ์ ๋น์จ์ ๋งํ๋ฉฐ, == ๊ฐ eigenvalue์ ๋น์จ
<value, vector = np.linalg.eig()>
*๋ฒกํฐ array๋ก ๋์ค๊ธฐ ๋๋ฌธ์ ๋ฒกํฐ๊ฐ์ ์์๋๋ก ์ฝ์ด์ผ๋จ df[:,0] ์ ์ฒดํ์์ 0๋ฒ์งธ ์ด
array([[-0.9057736 , -0.85343697],
[ 0.42376194, -0.52119606]]
Principal Component Analysis (PCA)
<์์์ผํ ๊ฐ๋ >
PCA -> ๊ณต๋ถ์ฐ -> ํ๋ ฌ -> ๋ฒกํฐ์ ๋ด์ (์ ์ฌ์), ๊ณ ์ ๋ฒกํฐ, ๊ณ ์ ๊ฐ
- ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ถ์ ํ๊ธฐ ์ํ ๊ธฐ๋ฒ
- ๋ฎ์ ์ฐจ์์ผ๋ก ์ฐจ์์ถ์
- ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์๊ฐํ + clustering
- ์๋ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์ ์ ๋ณด(๋ถ์ฐ)๋ฅผ ์ต๋ํ ์ ์งํ๋ ๋ฒกํฐ๋ฅผ ์ฐพ๊ณ , ํด๋น ๋ฒกํฐ์ ๋ํด ๋ฐ์ดํฐ๋ฅผ (Linear)Projection
- ๋ฐ์ดํฐ๋ค์ ์ฐจ์ ์ถ์์ํฌ ๋ ๊ฐ์ฅ ์๋ ์๋ฏธ๋ฅผ ์ ๋ณด์กด
๋ฐ์ดํฐ๋ค์ ์ ์ฌ์ ์์ผ ์ฐจ์์ ๋ฎ์ถ๋ค๋ฉด,
์ด๋ค ๋ฒกํฐ์ ๋ฐ์ดํฐ๋ค์ ์ ์ฌ์ ์์ผ์ผ ์๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ผ ์ ์ ์งํ ์ ์์๊น?
์ ์ฌ์์ด๋??
https://cord-ai.tistory.com/12
n132 ๊ณต๋ถ์ฐ๊ณผ ์๊ด๊ณ์ cov, corr/ vector
๋ถ์ฐ, ํ์คํธ์ฐจ * ๋ถ์ฐ์, ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ํผ์ ธ์๋์ง๋ฅผ ์ธก์ ํ๋ ๋ฐฉ๋ฒ = (๊ด์ธก๊ฐ๊ณผ ํ๊ท ์ ์ฐจ)๋ฅผ ์ ๊ณฑํ ๊ฐ์ ๋ชจ๋ ๋ํ๊ณ ๊ด์ธก๊ฐ ๊ฐ์๋ก ๋๋ ๊ฐ = ์ฐจ์ด ๊ฐ์ ์ ๊ณฑ์ ํ๊ท * ๋ถ์ฐ์ ๊ตฌํ๋ ๊ณผ์
cord-ai.tistory.com
๋ถ์๊ณผ์
- scikit-learn PCA๋ ํน์ด๊ฐ ๋ถํด(SVD, Singular Value Decomposition)๋ฅผ ์ด์ฉํด ๊ณ์ฐ
https://darkpgmr.tistory.com/106
[์ ํ๋์ํ #4] ํน์ด๊ฐ ๋ถํด(Singular Value Decomposition, SVD)์ ํ์ฉ
ํ์ฉ๋ ์ธก๋ฉด์์ ์ ํ๋์ํ์ ๊ฝ์ด๋ผ ํ ์ ์๋ ํน์ด๊ฐ ๋ถํด(Singular Value Decomposition, SVD)์ ๋ํ ๋ด์ฉ์ ๋๋ค. ๋ณดํต์ ๋ณต์์ ๊ณต๊ฐ์ ํฌํจํ์ฌ ์ ์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์ง๋ง ์ด ๊ธ์์๋ ์ค์(real
darkpgmr.tistory.com
1. ๊ฐ์ฅ ๋ถ์ฐ์ด ํฐ ์ฃผ์ฑ๋ถ ~~ ์ฐจ๋ก๋ก ๊ตฌํจ
= ์ฃผ์ฑ๋ถ ๊ฐ์(n_components)๋ฅผ ์ค์ ํ ๋, ๋ช ๊ฐ์ ์ฃผ์ฑ๋ถ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ ์ง ์์๋ก ํ๋จํ๋ ๊ฒ์ ์ด๋ ต๋ค.
๋ฐ๋ผ์, 0~1 ์ฌ์ด์ ์ค์๋ฅผ ์ ๋ คํ๋ฉด ์ง์ ๋ ๋น์จ๋งํผ์ ๋ถ์ฐ์ด ์ ์ง๋๋ ์ต์ํ์ ์ฃผ์ฑ๋ถ ๊ฐ์๋ฅผ ์๋์ผ๋ก ์ ํ
# 5% ๋งํผ์ ์ ๋ณด(๋ถ์ฐ)์ ์๋๋ค
pca = PCA(n_components=0.95)
๋ค์ฐจ์์ ๋ฐ์ดํฐ์์ ์ฐจ์ ๊ฐ์๋ฅผ ์์ผ์ฃผ๋ ๊ฒ์ด PCA์ ์ฃผ๋ชฉ์ ,
๊ทธ๋ฌ๋ฉด ๊ณ ์ฐจ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋๊น์ง ์ฐจ์๊ฐ์ ์์ผ์ฃผ๋ ๊ฒ์ด ํ๋นํ ๊น?
EX) N์ฐจ์์ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ํ ๋, N๊ฐ์ eigenvalue๋ฅผ ๊ณ์ฐํ ์ ์๋๋ฐ ๋์ ๋๋(= np.cumsum()) Eigenvalue์ ํฉ์ด,
90%์ด์ or ๊ทผ์ ํ๋ฉด ํด๋น ์ฐจ์๊น์ง ์ค์ด๋ ๊ฒ์ด ํ๋นํจ
2. PC(์ฃผ์ฑ๋ถ)์ ์๋ก ์ง๊ตํจ(= ๊ณต๋ถ์ฐ ํ๋ ฌ์ ๊ณ ์ ๋ฒกํฐ์ด๋ฏ๋ก) == ์๊ด๊ณ์ 0 / ์๋ก ์๋ฏธ๊ฐ ์๋ค๋ ๋ป
3. ๋จ์ ์ค์ผ์ผ๋ง์ด ํ์ํจ => ํ์คํ / ํ๊ท 0, ๋ถ์ฐ1
4. ๋ถ์ฐ ๊ณต๋ถ์ฐ matrix๋ฅผ ๋ง๋ฌ
๊ณ ์ ๋ฒกํฐ๋ ๊ทธ ํ๋ ฌ์ด ๋ฒกํฐ์ ์์ฉํ๋ ์ฃผ์ถ(principal axis)์ ๋ฐฉํฅ์ ๋ํ๋ด๋ฏ๋ก ๊ณต๋ถ์ฐ ํ๋ ฌ์
๊ณ ์ ๋ฒกํฐ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ๋ถ์ฐ๋์ด ์๋์ง๋ฅผ ๋ํ๋ด์ค๋ค๊ณ ํ ์ ์๋ค.
๋ฐ์ดํฐ ๋ฒกํฐ๋ฅผ ์ด๋ค ๋ฒกํฐ์ ๋ด์ (ํน์ ์ ์ฌ์)ํ๋ ๊ฒ์ด ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ฃผ๋๊ฐ?’
5. ๊ณ ์ ๊ฐ๊ณผ ๊ณ ์ ๋ฒกํฐ๋ฅผ ๊ตฌํจ(= ํ์คํํ๊ฒ ๋๋ฉด ์ด๋ถ์ฐ์ ๊ฐฏ์๋งํผ ๊ฐ์ด ๋์ด, 2๊ฐ์ ๋ณ์๋ฉด ์ด๋ถ์ฐ๋ 2)
๊ณ ์ ๊ฐ์ด ํฐ ์์๋๋ก ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ ๋ ฌํ๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค์ํ ์์๋๋ก ์ฃผ์ฑ๋ถ์ ๊ตฌํ๋ ๊ฒ์ด ๋๋ค.
๊ณ ์ ๋ฒกํฐ ๋ ๊ฐ๋ฅผ ๋ณผ ์ ์๊ณ ๊ฐ๊ฐ์ ๋ฒกํฐ์ ํฌ๊ธฐ๊ฐ ๊ฐ ๋ฒกํฐ์ ๊ณ ์ณ๊ฐ์ ์๋ฏธํ๋ค.
6. ๋์จ PC๊ฐ๊ณผ ๋ณ์์ ์๊ด๊ด๊ณ๋ฅผ ๋ด(= ๊ณ ์ ๊ฐ/๋ณ์ ๊ฐ์ ==> ๊ฐ ๋ณ์์ ์๊ด๊ด๊ณ)
( ๋จผ์ ๋ณ์์ฌ์ด์ ์๊ด๊ด๊ณ๋ฅผ ๋ณด๋ฉด์ '์ด ์ฃผ์ฑ๋ถ์ ๋ฌด์์ด๋ค'๋ผ๊ณ ์นญํ๋ค๊ณ ๊ฐ์ ์ ํจ)
7. ํฌ์(projection) ๊ฐ์ด ์์ ๊ฐ ๊ธฐ์ค์ผ๋ก ๋ด
https://angeloyeo.github.io/2019/07/27/PCA.html
์ฃผ์ฑ๋ถ ๋ถ์(PCA) - ๊ณต๋์ด์ ์ํ์ ๋ฆฌ๋ ธํธ (Angelo's Math Notes)
angeloyeo.github.io
Code
from sklearn.preprocessing import StandardScaler, Normalizer
from sklearn.decomposition import PCA
#๋จผ์ ๋ฐ์ดํฐ ํ์คํ ์ํด(= ๋จ์ ์ค์ผ์ผ๋ง) , ์ ๊ทํ = ๋ถ์ฐ
scaler = StandardScaler()
Z = scaler.fit_transform(data_f)
print("\n Standardized Data: \n", Z)
pca = PCA(2) # n_componets == ์ฃผ์ฑ๋ถ ๊ฐ์
pca.fit(Z) # Z๋ฅผ ๊ฐ์ง ๋ชจ๋ธ๋ก ๋ง์ถ๋ค
# pca.components == ๊ณ ์ ๋ฒกํฐ
print("\n Eigenvectors: \n", pca.components_)
# Eigenvalues == ๊ณ ์ ๊ฐ
print("\n Eigenvalues: \n",pca.explained_variance_ )
ratio= pca.explained_variance_ratio_
print(ratio)
# ์ฃผ์ฑ๋ถ ๋น์จ
[0.68633893 0.19452929]
## cumsum์ ๋ฐฐ์ด์์ ์ฃผ์ด์ง ์ถ์ ๋ฐ๋ผ ๋์ ๋๋ ์์๋ค์ ๋์ ํฉ์ ๊ณ์ฐํ๋ ํจ์.
'''
a = np.array([[1,2,3], [4,5,6]])
print(np.cumsum(a)) # (axis=0, 1) ==> axis์ ๋ฐ๋ฅธ ๋์ ํฉ
[ 1 3 6 10 15 21]
'''
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1
print('์ ํํ ์ฐจ์ ์ :', d)
Standardized Data:
[[-0.89604189 0.7807321 -1.42675157 -0.56847478]
[-0.82278787 0.11958397 -1.06947358 -0.50628618]
[-0.67627982 0.42472926 -0.42637319 -1.1903608 ]
...
[ 1.17338426 -0.74499437 1.50292796 1.91906927]
[ 0.22108196 -1.20271231 0.78837197 1.23499466]
[ 1.08181673 -0.54156417 0.85982757 1.48374906]]
Eigenvectors:
[[ 0.45375317 -0.39904723 0.576825 0.54967471]
[ 0.6001949 0.79616951 0.00578817 0.07646366]]
'''
์ฃผ์ฑ๋ถ ๋น์จ์ด ==> ๋ pc1, pc2 ๊ฐ์ ํฉ์ด 0.88 ์ด์ ์ฆ, ๋ ๊ฐ์ ์ฃผ์ฑ๋ถ์ด ์ ์ฒด ๋ถ์ฐ์ ์ฝ 88%
๋ฐ๋ผ์, ์ถ๊ฐ์ ์ธ ์ฃผ์ฑ๋ถ์ ํฌ์
ํ๋๋ผ๋ ์ค๋ช
๊ฐ๋ฅํ ๋ถ์ฐ๋์ด ์ผ๋ง ์ฆ๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์
์ฃผ์ฑ๋ถ์ ๋ ๊ฐ๋ก ๊ฒฐ์ ํ๋ ๊ฒ์ด ์ ์ ํ๋ค๊ณ ํ ์ ์๋ค.
'''
# pca.transform(df) ## ํฌ์ํ(=์ฃผ์ฑ๋ถ ์ ์๋ค) ๊ฐ(= np.matmul(matrix, vector) )
B = pca.transform(Z)
# PCA Projection to 2D
D = pd.DataFrame(data= B, columns= ['pc1', 'pc2'])
# ์ฃผ์ฑ๋ถ ์ ์๊ฐ์ ์๊ด๊ณ์
D.corr() #์ฃผ์ฑ๋ถ ์ ์๊ฐ์ ์๊ด๊ณ์ = 0 ==> ์ง๊ฐ์ด๋๊น
Scree Plot
## ๊ทธ๋ํ
fig, ax= plt.subplots(figsize=(10,8))
plt.plot(pca.explained_variance_, 'o-') ## screeplot ํ์ธ
'''
๊ทธ๋ํ์์ ํน์ ๊ตฌ๊ฐ๋ถํฐ ๊ฐ์๊ธฐ ๊บพ์ด๋ ๋ถ๋ถ๊น์ง ์ฐจ์ ๊ฐ์๋ฅผ ์์ผ์ค๋ค
scree plot์ PCA์ธ์๋ ๋ง์ method์์ ์ฌ์ฉ๋๋ค.
'''
Feacture Selection:
Feature Selection์ด๋ ๋ฐ์ดํฐ์ ์์ ๋ ์ค์ํ feature๋ฅผ ์ ๊ฑฐ ํ๋ ๋ฐฉ๋ฒ
Feature Extraction
- ๊ธฐ์กด์ ์๋ Feature or ๊ทธ๋ค์ ๋ฐํ์ผ๋ก ์กฐํฉ๋ Feature๋ฅผ ์ฌ์ฉ ํ๋ ๊ฒ
Selection ์ ๊ฒฝ์ฐ
- ์ฅ์ : ์ ํ๋ feature ํด์์ด ์ฝ๋ค.
- ๋จ์ : feature๋ค๊ฐ์ ์ฐ๊ด์ฑ์ ๊ณ ๋ คํด์ผํจ.
- ์์ : LASSO, Genetic algorithm ๋ฑ
Extraction์ ๊ฒฝ์ฐ
- ์ฅ์ : feature ๋ค๊ฐ์ ์ฐ๊ด์ฑ ๊ณ ๋ ค๋จ. feature์ ๋ง์ด ์ค์ผ ์ ์์
- ๋จ์ : feature ํด์์ด ์ด๋ ค์.
- ์์ : PCA, Auto-encoder ๋ฑ
'Data Analysis, DA > Linear Algebra' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Log Transform (0) | 2023.05.31 |
---|---|
n134 Clustering ๊ตฐ์ง๋ถ์ (0) | 2021.05.29 |
n132 ๊ณต๋ถ์ฐ๊ณผ ์๊ด๊ณ์ cov, corr/ vector (0) | 2021.05.27 |
n131 ๋ฒกํฐ์ ํ๋ ฌ(vector and matrices)/ ์ ํ๋์ (0) | 2021.05.22 |
๋๊ธ