수많은 데이터의 저장공간을 절약하기 위하여 차원축소를 할 수 있다
데이터는 14.k-평균의 데이터를 활용하였다
기본적으로 fruits_2d는 300개의 100*1000 이미지이다
print(fruits_2d.shape) # (300, 10000)
fruits_pca = pca.transform(fruits_2d)
print(fruits_pca.shape) # (300, 50)
이를 50개의 이미지로 압축해보자
from sklearn.decomposition import PCA
pca = PCA(n_components=50)
pca.fit(fruits_2d)
print(pca.components_.shape) # (50, 10000)
draw_fruits(pca.components_.reshape(-1,100,100))
이 이미지는 일종의 데이터 셋의 특징으로 이해 할 수 있다
fruits_inverse = pca.inverse_transform(fruits_pca)
print(fruits_inverse.shape) # (300, 10000)
fruits_reconstruct = fruits_inverse.reshape(-1,100,100)
for start in [0,100,200]:
draw_fruits(fruits_reconstruct[start:start+100])
print("\n")
이미지 보기
![](https://velog.velcdn.com/images/kimsw3445/post/16ee03d8-c8ee-42a8-8897-8ba25a53b79b/image.png)
![](https://velog.velcdn.com/images/kimsw3445/post/60010e4d-015b-4ac6-ae9e-ab6e91b7eff0/image.png)
![](https://velog.velcdn.com/images/kimsw3445/post/00c7d796-f5c5-4007-8a97-ef6d869954ee/image.png)
약간 이미지가 깨지긴 하였지만, 잘 복원되었다
print(np.sum(pca.explained_variance_ratio_)) # 0.921...
plt.plot(pca.explained_variance_ratio_)
plt.show()
90%가 넘는 분산을 유지한다
그래프를 참고하면 처음 10개의 주성분이 대부분의 분산을 표현중이다
로지스틱회귀에 PCA를 활용하여 차이점을 확인해보자
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
target = np.array([0]*100 + [1]*100 + [2]*100)
로지스틱 회귀는 지도학습이므로 타겟을 설정 후 훈련을 진행하였다
from sklearn.model_selection import cross_validate
scores = cross_validate(lr, fruits_2d, target)
print(np.mean(scores['test_score'])) # 0.996...
print(np.mean(scores['fit_time'])) # 0.461...
검증점수는 97%로 매우 높으며, 수행시간은 0.94초가 걸렸다
이제 PCA를 통해 압축 후 진행해보자
scores = cross_validate(lr, fruits_pca, target)
print(np.mean(scores['test_score'])) # 1.0
print(np.mean(scores['fit_time'])) # 0.021...
정확도는 100%에, 훈련시간은 0.02초로 매우 감소하였다
pca = PCA(n_components=0.5)
pca.fit(fruits_2d)
print(pca.n_components_) # 2
분산이 50%인 주성분을 찾아 PCA 모델을 만들었고, 2개의 특성만으로 훈련이 가능하다
fruits_pca = pca.transform(fruits_2d)
print(fruits_pca.shape) # (300,2 )
scores = cross_validate(lr,fruits_pca, target)
print(np.mean(scores['test_score'])) # 0.99
print(np.mean(scores['fit_time'])) # 0.030...
2개의 특성만으로 99%의 정확도와 0.04초의 훈련시간을 보인다
이번에는 축소된 데이터를 통해 KMeans 알고리즘을 수행해보자
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, random_state=42)
km.fit(fruits_pca)
print(np.unique(km.labels_,return_counts=True))
# (array([0, 1, 2]), array([110, 99, 91], dtype=int64))
위 데이터를 km.labels_를 통해 산점도를 그려보았다
for label in range(0,3):
data = fruits_pca[km.labels_ == label]
plt.scatter(data[:,0], data[:,1])
plt.legend(['apple','banana','p-apple'])
plt.show