일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바 실습
- 영어공부
- 텍스트마이닝
- numpy/pandas
- 중학1-1
- html/css
- 데이터분석
- 컴퓨터구조
- SQL
- JSP/Servlet
- 파이썬라이브러리
- 컴퓨터비전
- 연습문제
- 정수와유리수
- pandas
- 파이썬
- 중학수학
- 딥러닝
- 정보처리기사실기
- C++
- CNN
- 혼공머신
- 정보처리기사필기
- 데이터베이스
- 코딩테스트
- 운영체제
- 데이터입출력구현
- 머신러닝
- CSS
- 자바
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
비지도 학습 5 - 주성분 분석 1 : 주성분 분석으로 차원 축소 알고리즘 사용해보기 본문
비지도 학습의 마지막 단원이다. 이 공부도 최대한 빠르게 학습해 볼 것이다.
학습 목표
차원 축소에 대해 이해하고 대표적인 차원 축소 알고리즘 중 하나인 PCA(주성분 분석) 모델을 만들어본다.
시작하기 전에
k-평균 알고리즘으로 업로드된 사진을 클러스터에 분류하여 폴더별로 저장했다. 그런데 이벤트가 진행되면서 문제가 생겼다. 너무 많은 사진이 등록되어 저장 공간이 부족하다. 나중에 군집이나 분류에 형향을 끼치지 않으면서 업로드된 사진의 용량을 줄일 수 있을까?
차원과 차원 축소
지금까지 데이터가 가진 속성을 특성이라 불렀다. 머신러닝에서는 이런 틈성을 차원이라고도 부른다. 10000개의 특성은 결국 10000개의 차원이라는 것인데, 이 차원을 줄일 수 있다면 저장 공간을 크게 절약할 수 있다.
2차원 배열과 1차원 배열(벡터)에서 차원이란 용어를 조금 다르게 사용한다. 다차원 배열에서 차원은 배열의 축 개수가 된다. 가령 2차원 배열일 때는 행과 열이 차원이 된다. 하지만 1차원 배열 즉 벡터일 때는 원소의 개수를 말한다.
차원 축소는 데이터를 가장 잘 나타내는 일부 특성을 선택하여 데이터 크기를 줄이고, 지도 학습 모델의 성능을 향상할 수 있는 비지도 학습 방법이다.
또한 줄어든 차원에서 다시 원본 차원으로 손실을 최대한 줄이면서 복원할 수도 있다. 여기서는 대표적인 차원 축소 알고리즘인 주성분 분석에 대해서 학습해 볼 것이다. 주성분 분석을 간단히 PCA라고도 부른다.
주성분 분석 소개
주성분 분석은 데이터가 있는 분산이 큰 방향을 찾는 것으로 이해할 수 있다. 분산은 데이터가 널리 퍼져있는 정도를 말한다. 분산이 큰 방향이란 데이터를 잘 표현하는 어떤 벡터이다. 다음과 같은 2차원 벡터를 생각해 보자.
이 데이터는 x1, x2 2개의 특성이 있다. 대각선 방향으로 길게 늘어진 형태를 갖고 있다. 이 데이터에서 가장 분산이 큰 방향은 어디일까? 직관적으로 우리는 길게 늘어진 대각선 방향이 분산이 가장 크다고 알 수 있다. 위의 그림의 화살표 방향 위치는 큰 의미가 없다. 중요한 것은 분산이 큰 방향을 찾는 것이다.
앞에서 찾은 직선이 원점에서 출발한다면 두 원소로 이 루어진 벡터로 쓸 수 있다. 예를 들어 다음 그림의 (2, 1)처럼 나타낼 수 있다.
이 벡터를 주성분이라고 부른다. 이 주성분 벡터는 원본 데이터에 있는 어떤 방향이다. 따라서 주성분 벡터의 원소 개수는 원본 데이터셋에 있는 특성 개수와 같다. 원본 데이터는 주성분을 사용해 차원을 줄일 수 있다. 예를 들면, 다음과 같이 샘플 데이터 s(4, 2)를 주성분에 직각으로 투영하면 1차원 데이터 p(4.5)를 만들 수 있다.
주성분은 원본 차원과 같고 주성분으로 바꾼 데이터는 차원이 줄어든다는 점을 꼭 기억하자. 첫 번째 주성분을 찾은 다음 이 벡터에 수직이고 부산이 가장 큰 다음 방향을 찾는다. 네 번째 그림이 두 번째 주성분이다. 여기서는 2차원이기 때 문에 두번째 주성분의 방향은 하나뿐이다.
PCA 클래스
과일 사진 데이터를 다운로드하여 넘파이 배열로 적재한다. 사이킷런은 PCA 클래스로 주성분 분석 알고리즘을 제공한다. PCA 클래스 객체를 만들 때, n_components 개개변수에 주성분의 개수를 지정해야 한다.
n_components=50으로 지정했기 때문에 pca.compnents_ 배열의 첫 번째 차원이 50이다. 즉 50개의 주성분을 찾은 것이다. 두 번째 차원은 항상 원본 데이터의 특성 개수와 같은 10000이다. 원본 데이터와 차원이 같으므로 주성분을 100 x 100 크기의 이미지처럼 출력해 볼 수 있다.
이 주성분은 원본 데이터에서 가장 분산이 큰 방향을 순서대로 나타낸 것이다. 주성분을 찾았으므로 원본 데이터를 주성분에 투영하여 특성의 개수를 10000개에서 50개로 줄일 수 있다.
데이터의 차원을 줄였다면 다시 원상 복구할 수 있을지 알아보자.
원본 데이터 재구성
앞에서 10000개의 특성을 50개로 줄였다. 이로 인해 어느 정도 손실이 발생할 수밖에 없다. 하지만 최대한 분산이 큰 방향으로 데이터를 투영했기 때문에 원본 데이터를 상당 부분 재구성할 수 있다.
PCA 클래스는 이를 위해 inverse_transform() 메서드를 제공한다.
예상대로 1만 개의 특성이 복원되었다. 이 데이터를 100 x 100 크기로 바꾸어 100개씩 나누어 출력했다. 이 데이터는 순서대로 사과, 파일애플, 바나나를 100개씩 담고 있다. 과일이 거의 잘 복원되었다. 일부 흐리고 번진 부분이 있지만 불과 50개의 특성을 10000개로 늘린 것을 감안한다면 놀라운 일이다.
그럼 50개의 특성은 분산을 얼마나 보존하고 있을까?
설명된 분산
주성분이 원본 데이터의 분산을 얼마나 잘 나타내는지 기록한 값을 설명된 분산이라고 한다. PCA 클래스의 explained_variance_ratio_에 각 주성분의 설명된 분산 비율이 기록되어 있다. 당연히 첫 번째 주성분의 설명된 분산이 가장 크다. 이 분산 비율을 모두 더하며 50개의 주성분으로 표현하고 있는 총 분산 비율을 얻을 수 있다.
이 그래프를 보면 처음 10개의 주성분이 대부분 분산을 표현하고 있다. 그다음부터는 각 주성분이 성명하고 있는 분산은 비교적 작다. 이번에는 PCA로 차원 축소된 데이터를 사용하여 지도 학습 모델을 훈련해 보겠다.
다른 알고리즘과 함께 사용하기
과일 사진 원본 데이터와 PCA로 축소한 데이터를 지도 학습에 적용해 보고 어떤 차이가 있는지 알아보겠다. 3개의 과일 사진을 분류해야 하므로 간단히 로지스틱 회귀 모델을 사용한다. 먼저 사이킷런의 LogisticRegression 모델을 만든다. 지도 학습 모델을 사용하려면 타깃값이 있어야 한다. 여기서는 사과를 0, 파인애플을 1, 바나나를 2로 지정하겠다.
파이썬 리스트와 정수를 곱하면 리스트 안의 원소를 정수만큼 반복한다. 이를 이용하면 100개의 0, 1, 2로 이루어진 타깃 데이터를 손쉽게 만들 수 있다.
50개의 특성만 사용했는데도 정확도가 100%이고 훈련 시간은 0.03초로 20배 이상감소했다. PCA로 훈련 데이터의 차원을 축소하면 저장 공간분만 아니라 머신러닝 모델의 훈련 속도도 높일 수 있다. PCA 클래스는 지정된 비율에 도달할 때까지 자동으로 주성분을 찾는다.
설명된 분산의 50%에 달하는 주성분을 찾도록 PCA 모델을 만들었다. 주성분 개수 대신 0~1 사시의 비율을 실수로 입력하면 된다. 2개의 특성만으로 원본 데이터에 있는 분산의 50%를 표현할 수 있다는 결과가 나왔다.
이 모델로 원본 데이터를 변환한다. 주성분이 2개이므로 변환된 데이터의 크기는 (300, 2)가 된다. 교차 검증 결과도 99%의 정확도에 달했다.
이번에는 차원 축소된 데이터를 사용해 K-평균 알고리즘으로 클러스터를 찾아보겠다. fruits_pca로 찾은 클러스터는 각각 110개, 99개, 91개의 샘플을 포함하고 있다. 이는 지난 장에서 원본 데이터를 사용했을 때와 거의 비슷한 결과이다. KMeans가 찾은 레이틀을 사용해 과일 이미지를 출력한다.
앞선 장에서 찾은 클러스터와 비슷하게 파인애플은 사과와 조금 혼동되는 면이 있다. 몇 개의 사과가 파일애플 클러스터에 섞여 들어가 있다.
훈련 데이터의 차원을 줄이면 또 하나 얻을 수 있는 장점은 시각화이다. 3개 이하로 차원을 줄이면 화면에 출력하기 비교적 쉽다. 앞에서 찾은 km.labels_를 사용해 클러스터별로 나누어 산점도를 그려보았다.
각 클러스터의 산점도가 아 주 잘 구분된다. 이 그림을 보면 사과와 파인애플 클러스터의 경계가 가깝게 붙어 있다. 이 두 클러스터의 샘플은 몇 개가 혼동을 일으키기 쉬울 것 같다. 데이터를 시각화하면 예상치 못한 통찰을 얻을 수 있다. 그런 면에서 차원 축소는 매우 유용한 도구 중 하나이다.
학습을 마치고
주성분 분석 학습도 잘 마쳤다. 이제 남은 과제는 이 단원의 실습을 진행하고 문제를 풀어보는 일이다. 시간이 별로 없으니 최대한 빠르게 학습해 볼 것이다. 오늘 아침에 기적을 만드는 중이다.
불가능할 것 같은 학습 목표를 이루고 있다.
'인공지능 > 머신러닝' 카테고리의 다른 글
나의 첫 머신러닝 5 - 마켓과 머신러닝 심화 학습 (0) | 2024.10.01 |
---|---|
비지도 학습 6 - 주성분 분석 2 : 스스로 실습하고 문제를 풀어보는 시간 (0) | 2024.09.30 |
비지도 학습 4 - k-평균 2 : 스스로 실습하고 문제 풀어보는 시간 (0) | 2024.09.30 |
비지도 학습 3 - k-평균 1 : k 평균 알고리즘으로 주어진 정보가 없는 상태에서 과일 사진 분류하기 (0) | 2024.09.30 |
비지도 학습 2 - 군집 알고리즘 2 : 스스로 실습하며 문제를 풀어보는 시간 (0) | 2024.09.30 |