PCA 주성분 분석¶
전처리
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
iris = pd.DataFrame(iris.data, columns=iris.feature_names)
iris['Class']=load_iris().target
iris['Class']=iris["Class"].map({0:"Setosa",1:"Versiolour",2:"Virginica"})
iris.head()
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | Class | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | Setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | Setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | Setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | Setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | Setosa |
PCA를 수행하기전 스케일 차이가 영향을 주는것을 방지하기 위해 사용한다.
x=iris.drop(columns='Class')
from sklearn.preprocessing import StandardScaler
x = StandardScaler().fit_transform(x)
pd.DataFrame(x).head()
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | -0.900681 | 1.019004 | -1.340227 | -1.315444 |
1 | -1.143017 | -0.131979 | -1.340227 | -1.315444 |
2 | -1.385353 | 0.328414 | -1.397064 | -1.315444 |
3 | -1.506521 | 0.098217 | -1.283389 | -1.315444 |
4 | -1.021849 | 1.249201 | -1.340227 | -1.315444 |
from sklearn.decomposition import PCA
pca = PCA(n_components=4) # 생성할 주성분의 갯수
pca_fit = pca.fit(x)
# 여기에서는 X의 갯수가 최대 4개 이기 때문에 4개이다.
# 적당한 주성분값은 아래에서 다시 정하도록 한다.
# 전체 데이터에서 해당 모델로 설명할 수 있는 분산의 비율
pca.singular_values_
array([20.92306556, 11.7091661 , 4.69185798, 1.76273239])
# 전체 데이터에서 각 주성분이 설명할 수 있는 분산의 비율
pca.explained_variance_ratio_
array([0.72962445, 0.22850762, 0.03668922, 0.00517871])
import matplotlib.pyplot as plt
plt.plot(pca.explained_variance_ratio_)
[<matplotlib.lines.Line2D at 0x29d4e5ef4f0>]
# 위 그래프에서 기울기가 급격히 감소하는 지점의 직전까지 주성분으로 선택한다.
# 위 그래프에서는 2가 된다.
# 만약 n_components 값이 4보다 작을때 어떻게 되는지 살펴보자
for nn in [1,2,3,4]:
pca = PCA(n_components=nn)
pca_fit = pca.fit(x)
plt.title(nn)
plt.plot(pca.explained_variance_ratio_,"o-")
plt.show()
# 결국 최대 4인 경우(iris 의 X의 최대 갯수) 작은 값들도 모두 알 수가 있다.
# 최종 값이 결정되었으면 다시 PCA 데이터를 생성한다
pca = PCA(n_components=2)
pca_fit=pca.fit(x)
pca_tra=pca_fit.transform(x)
pca_irs = pd.DataFrame(data=pca_tra, columns=["pc1","pc2"])
pca_irs.head()
pc1 | pc2 | |
---|---|---|
0 | -2.264703 | 0.480027 |
1 | -2.080961 | -0.674134 |
2 | -2.364229 | -0.341908 |
3 | -2.299384 | -0.597395 |
4 | -2.389842 | 0.646835 |