머신러닝

머신 러닝(with Google Colab) - 6일차(3)

aisw7984 2024. 10. 25. 17:05
반응형

주성분 분석(PCA)

머신러닝의  비지도 학습 핵심 알고리즘인'주성분분석'은 여러 개의 특성이 있는 데이터에서 주요한 특성을 뽑아내서 특성 개수를 줄이는 방법 이 알고리즘에는 복원 기능이 있다.
주요 역할

  • 차원축소 :
  • 주성분 분석 : 많은 특성을 사용하면 과대적합과 런타임이 늘어난다는 문제가 있는데 이를 예방해 준다.

이전에 사용했던 데이터를 불러와보자

#!wget https://bit.ly/fruits_300_data -O fruits_300.npy
import numpy as np
fruits = np.load('fruits_300.npy')
fruits_2d = fruits.reshape(-1, 100*100)
#PCA클래스의 객체를 만들때는 n_components 매개변수에 주성분 개수를 지정해야함/ 0.n은 전체를1 로 보고 비율로 개숫지정
from sklearn.decomposition import PCA
pca =PCA(n_components=50) # 50개의 주성분 추출
pca.fit(fruits_2d)
print(pca.components_.shape)

PCA는 주성분을 분석해 주는 클래스인데 이를 이용하면 데이터 안에서 지정한 수만큼 주성분을 추출해 준다.

추가로 앞서 만들었던 이미지 출력함수도 가져와보자

import matplotlib.pyplot as plt

# ratio 은 이미지의 배율
def draw_fruits(arr, ratio=1):
    n =len(arr) # arr 는 입력된 샘플 수
    # row : 행 , col : 열

    # 한행에 10개씩 그림 그리기 위해 행 수 구하기
    rows = int(np.ceil(n/10))
    # np.ceil : 주어진 입력값보다 크거나 같은 최소 정수를 반환한다(올림)
    # 다음을 해주는 이유는 91개의 데이터를 이미지로 출력하려면 10행이 필요하기때문

    #행수가 1이면 n을 반환한하고 아니면 10
    cols = n if rows ==1 else 10

    fig, axs =plt.subplots(rows, cols, figsize=(cols*ratio, rows*ratio),squeeze=False)
    # squeeze  1차원을 제거해주는 기능
    for i in range(rows):
        for j in range(cols):
            if i*10+j < n :
                axs[i,j].imshow(arr[i*10+j], cmap = "gray")
            axs[i,j].axis('off')

    # print("{}개 샘플 {}행 {}열".format(len(arr),rows,cols))
    plt.show()
draw_fruits(pca.components_.reshape(-1,100,100))
#결과가 과일의 사진은 아닌데 비슷한 그림이 나옴 -> 주성분의 이미지

주성분이라는 것이 사람기준이 아닌 컴퓨터가 중요하다는 정보를 모은 것이기 때문에 원본가 어느 정도 괴리가 느껴진다.

이제 추출한 주성분을 원본 데이터에 적용을 하고 형태를 확인해 보면

# 주성분에 투영해서 원본 샘플 변환하기
#특성의 경향은 잘 유지하되, 데이터릐 용량을 줄여준다.
fruits_pca=pca.transform(fruits_2d)
fruits_pca.shape # 기존 fruits_2d는 (300,10000) 이였는데 (300,50)으로 크기가 작아짐
->
(300, 50)

확실히 데이터의 크기가 줄어든 것을 확인할 수 있다. 이렇게 데이터가 작아지면 처리속도가 빨라진다는 장점이 있다.

반대로 데이터의 손실을 피할 수 없어 복구할 때 데이터의 손실이 발생한다.

#원상복구 - 원상복구시 데이터의 손실이 발생한다
fruits_inverse = pca.inverse_transform(fruits_pca)
draw_fruits(fruits_inverse.reshape(-1,100,100)[:100])

이전에 봤던 사과 샘플보다 약간 흐릿해진 느낌이 든다.

반응형