[혼공머신] Chapter6. 비지도학습

JB·2022년 2월 15일
0

혼공머신

목록 보기
6/9
post-thumbnail

드디어 머신러닝 파트의 마지막입니다. 마지막까지 열심히하고 딥러닝, 강화학습까지 가 보자고(존버는 승리...할까?)


아래 내용은 <혼자 공부하는 머신러닝 + 딥러닝>과 숙명여자대학교 소프트웨어학부 <데이터사이언스개론> <빅데이터처리> 수업을 참고하여 작성한 내용입니다.

1. 군집 알고리즘

마켓에서 생선에 이어 과일까지 팔기로 했다. 번창을 축하합니다. 가장 많이 요청이 들어온 과일을 선정하고 그 과일 사진을 보낸 고객 중 몇 명을 뽑아 당첨자로 선정한다고 합니다. 사진을 일일이 분류하기 귀찮으므로 종류별로 모을 수 있는 모델이 있으면 편하겠네용

  • 비지도학습(unsupervised learning) : 특정 target이 없이 패턴을 찾는 게 목적인 학습이다. clustering, co-occurrence grouping, profiling 이 주로 사용된다.

여기서는 픽셀값을 이용하여 사진을 분류해보자는 방식을 제안했습니다. 사진 데이터는 캐글에서 공개된 300개의 사과, 파인애플, 바나나 흑백사진을 이용한다고 합니다. wget으로 불러와줍니다. 100x100 짜리 사진 300장을 받아왔고 이를 각각 사과배열, 파인애플 배열, 바나나 배열로 나누어줍니다.
각 픽셀 평균값을 계산해서 히스토그램으로 출력해보았습니다.

바나나는 티가 나는데 파인애플과 사과가 비슷하게 겹쳐있어서 픽셀값으로 구분하기는 어려울 것 같습니다. 그렇다면 이번엔 픽셀 10,000개(100x100 이므로) 에 대한 평균값을 막대그래프로 그려서 확인해보도록 하겠습니다.
대체로 개형이 다르다는 것을 확인할 수 있었습니다! 이미지를 출력해서 확인해보겠습니다. 픽셀 평균값을 다시 100x100 으로 바꿔서 이미지처럼 출력해보면 됩니다.
이 이미지를 대표이미지로 생각하여 과일을 구분해봅시다!

평균값과 가까운 사진 고르기

fruits 배열의 300장 샘플에서 apple_mean 과의 오차 평균을 계산해서 이 값이 작은 샘플들을 골라내봅시다.

육안으로만 봐도 모두 사과가 뽑힌 것 같습니다! 와아ㅏㅏㅏ><
바나나와 파인애플도 보아하니 정확도는 97%로 예상됩니다.


2. k-평균

앞에서는 각각 과일 종류에 따라서 인덱스를 알고 있었지만 이런 경우는 흔치 않습니다. 따라서 우리는 k-평균 알고리즘을 통해 어떤 과일인지 알지 못하는 상태에서 clustering을 시도해보려 합니다.
k-means clustering은 centroid-based clustering algorithm 으로 k개 클러스터를 클러스터 내 평균 point를 잡아 묶는 것입니다.
방법은 다음과 같습니다.
1) k 개의 클러스터 centroid 선택
2) 중심에 가까운 점들로 클러스터 형성
3) 클러스터 내에서 centroid 업데이트
4) 업데이트 된 centroid 로 다시 clustering 형성
5) cluster centroid가 수렴할 때까지 3,4번을 반복함

k 값을 한 번에 찾는 것은 쉽지 않으며 주로 클러스터 평균 반지름을 최소화하는 클러스터를 만드는 것이 방법입니다. 실제로 구현해보도록 합시다

KMeans 클래스

사이킷런의 KMeans 를 import 하여 실행해보겠습니다. 과일 개수가 3개인 것을 알기 때문에 n_clusters = 3 으로 지정하여 0,1,2로 라벨링하도록 하였습니다. 각각 111, 98, 91 개로 클러스터링 하였네요

라벨별로 출력해보겠습니다.사과와 바나나에서 거의 100%, 파인애플은 90% 정확도를 보여주었습니다.

최적의 K 찾기

우리는 지금 과일이 3종류라는 것을 알고 n_clusters=3 이라고 써줬지만 사실 한 번에 best k값으 찾는 것은 쉽지 않습니다. k-means 를 여러번 실행하여 거리의 제곱합(intertia)가 최적인 클러스터 개수를 찾거나 Hierarchical Clustering(Agglomerative) 에서 적절한 클러스터 값을 찾아서 적용해보면 좋습니다.

Hierarchical Clustering - Bottom-up 방식

가장 대표적인 best-k 찾기 방법은 'elbow' method 입니다. 클러스터 중심과 클러스터 멤버들 사이의 거리의 제곱 합을 구해서 제곱합의 그래프를 그리면 꺾이는 지점이 있습니다. 이 꺾이는 지점이 'elbow point' 해당 포인트가 best-k 라고 할 수 있습니다.


3. 주성분 분석

과일 이벤트가 대성공했다고 합니다. 매일매일 사진이 업로드되고 클러스터별로 분류하여 저장했는데, 너무 많이 참여해주셔서 사진 저장공간이 부족하다고 합니다. 굳이 사진으로 모두 저장하지 않고 어떤 성분에 대한 데이터로 저장하면 빅데이터 처리를 더 효율적으로 할 수 있을 것입니다.

비지도학습 중 하나인 차원축소(Dimensionality Reduction) 알고리즘은 데이터를 가장 잘 나타내는 일부 특성만 선택하여 데이터 크기를 줄이고 선응을 향상시킵니다. 원본차원으로 손실을 최대한 줄이면서 복원할 수 있으며 그 중에서도 대표적인 '주성분 분석(Principal Component Analysis)'에 대해서 나와있습니다.

주성분 분석

원본 데이터의 특성을 가장 잘 보여줄 수 있도록 분산이 큰 고유벡터를 찾아 차원을 줄이는 방식이다.

PCA 클래스

10,000개 주성분을 50개 주성분으로 분석해서 transform()을 이용하여 50차원으로 줄여보겠습니다. 이것을 다시 원본처럼 바꾸려면 inverse_transform()을 사용하면 됩니다. 꽤 잘 복원된 것 같습니다.

설명된 분산

explained variance 는 주성분이 원본 데이터 분산을 얼마나 잘 나타내는지 기록된 값이다. explained_variance_ratio 에서 비율이 기록되고 내림차순으로 sort되어 있다고 한다. 출력해보았는데 어느정도가 적절한지는 잘 모르겠다.

분산 비율 합이 92% 이므로 괜찮아보이지만 실제로 1% 이상인 것은 9개 정도로 확인된다. PCA로 변환한 데이터와 원본 데이터가 어떤 차이가 있는지 확인해보도록 하자.

다른 알고리즘과 함께 사용하기

1. 로지스틱 회귀 pca축소 데이터 사용

먼저 로지스틱 회귀모델을 사용하여 과일을 잘 분류하는 지 확인해보겠습니다. PCA 축소 데이터가 100% 정확도에 학습 시간도 1/40 밖에 되지 않는다는 것을 알았습니다.

explained varience가 50% 에 가까운 성분만 찾아서 모델을 만들도록 하겠습니다. 사실 성분 50개의 ratio를 이미 출력해서 2개면 된다는 것을 알았지만 책에서 놀라워라! 2개라는 것을 알아내는 방법에 대해서도 설명하고 있으니 해봅시다. 성분 2개만으로도 99.3% 정확도를 보여주었습니다.

2. k-means 알고리즘에서 pca축소 데이터 사용

k-means 에서 cluster를 3개로 해서 원본과 비교해보겠습니다.
실제로 바나나를 하나 덜 틀려서 바나나-파인애플 분류에서는 더 정확하다고 할 수 있겠습니다. 클러스터링 결과를 산점도로 표현하니, 과일 종류별로 잘 클러스터링 된 것 같습니다.

이로써 주성분 분석을 통해 차원을 낮추는 것이 overfitting을 피하고 학습 시간 측면에서도 효율적인 것을 알 수 있었습니다.


6-3 확인문제

Q1. 특성이 20개인 대량의 데이터셋이 있다. 이 데이터셋에서 찾을 수 있는 주성분의 개수는?
A1. 20개

Q2. 샘플 개수가 1,000개 이고, 특성 개수가 100개인 데이터셋이 있다. 즉 이 데이터셋의 크기는 (1000, 100)이다. 이 데이터를 사이킷런의 PCA클래스를 사용해 10개의 주성분으로 변환했다. 데이터셋의 크기는?
A1. (1000, 10)

Q3. 2번 문제에서 explained varience가 가장 큰 주성분은 몇번째인가?
A1. 첫번째


고생했다 나 자신

다른 데이터로 적용까지는 못했지만 그래도 머신러닝에 대한 기본은 배웠다고...할 수 있겠지? 다음주부터 딥러닝 다시 시작하자.

화이팅 나 자신
profile
자율주행 이동체를 배우고 있는 JB입니다.

0개의 댓글