22.05.13 정답이 없는 문제 3주차

2022. 5. 16. 12:48카테고리 없음

2강 복습

3강에서 배울 것

정답이 없는 문제인 unsupervised learning

- 차원축소

- 클러스터링(군집화)

 

비지도학습(unsupervised learning)

- 트레이닝셋에 y값, 정답이 없고 input만 주어짐

- y를 예측하는 게 목표가 아니라 x(input feature)에서 의미있는 패턴을 찾는 것이 비지도학습의 목적

- 저 밑에 그림은 코로나를 알파,베타,감마등으로 나눈 것. 바이러스들의 특성을 보고 같은 특성을 가진 바이러스들을 군집화해줘서 이름을 붙여준 것 뿐. 

 

- 차원축소 : 데이터가 불필요하게 차원이 높을 때 고차원데이터를 저차원으로

- 클러스터링 : 비슷한 데이터끼리 군집을 해줌.

AI 모델 개발의 프로세스

- 문제정의 데이터수집 데이터분석 데이터모델링 결과분석

- 비지도학습은 데이터분석, 데이터모델링에서 사용될 수 있다(군집화 등), 마지막 결과분석에서 시각화에서도 쓰임

- 현업에서 사용하는 데이터는 정제되지 않기때문에 자주 쓰인다.

 

Dimensionality Reduction (차원축소)

- 고차원데이터 (추천시스템 user x movie, 이미지 h x w x 3 x frame, 유전자 등)

- curse of dimensionality : 데이터가 고차원일수록 같은 성능의 모델학습을 위해 더 많은 데이터가 필요.

그러나 고차원의 데이터도 본질적으로는 저차원에서 설명가능한 경우가 많음.

- MNIST : 8x8 이미지로 이뤄진 데이터셋, 0~5까지 숫자.. 6차원으로 저 64픽셀의 이미지를 표현할 수 있을것이고,

차원축소방법인 t-SNE를 사용하면 64픽셀을 2차원으로 보내도 의미있는 정보를 담을 수 있다(오른쪽그림)

- 차원축소: 불필요하게 중복되는 변수, 의미없는 변수를 줄이고 의미 있는 정보를 살려둠.

 

목적에 따라 다양한 차원축소가 존재

- PCA : 데이터 간의 variance를 보존하면서 차원 축소

- MDS : 데이터 간 거리를 보존하면서 차원 축소

- t-SNE : 로컬 거리 정보를 보존하면서 차원 축소, 시각화

- 딥러닝 기반 차원축소: Auto encoder, Word2Vec(Auto encoder : NN - 아래 2라는 이미지를 축소하는 예시그림, 10차원으로 줄였다가 다시 28x28이미지로 복원, 10차원을 28x28이미지로 복원하면서 10차원 벡터에 이미지의 의미있는 정보들이 담긴다. Word2Vec( 오른쪽 그림 : 우리가 사용하는 단어를 3차원 공간으로 임베딩, 비슷한 의미의 단어는 공간상에 비슷한 위치에 위치. )

 

PCA(Principal Components Analysis 주요성분 추출)

저 그림같은 데이터를 가지고 있을 떄, 좌우로 퍼져있으니 오른쪽 빨간선이 더 중요하다.

즉, PCA는 저 빨간선이 데이터의 분산을 가장 잘 설명해준다고 착안을 한다.

검은색 화살표(빨간선에 수선의 발을 내림 = projection을 한다)

projection하고 나서도 저 주황데이터들이 좌우로 퍼져있다. 

-> 원래 데이터의 분산을 잘 보존하는 축을 찾는다.

 

그럼 어떻게 그 빨간선(분산보존하는 축)을 찾느냐?

- 프로젝션 식을 수식화하면 된다. 

p : b를 a에 프로젝션한 벡터, ca로 표현가능(a와 방향은 같고 크기가달라서)

그 다음 b에서 p벡터를 빼주면 수선의발에서 위로 올라가는 벡터가 나오는데, 이 벡터가 a벡터와 수직하다는 사실을 이용하면 상수 c를 구할 수 있다. 여기서 a의 크기가 1이면 p는 단순히 bTaa가 됨.

n개의 데이터에 d차원의 데이터를 가지고 있다 치면 dxn 행렬 이 된다. 벡터 형태로 프로젝션을 할 수 있도록 행렬의 평균값이 제로벡터라고 가정을 하면 (각 차원(columns)에 대해 n개 데이터를 평균냄) 

만약 평균이 0이 아니면 평균을 구해서 원래 행렬 X에서 빼주면 됨.

projection 할 벡터(아까 위에서 a, )는 w라고 부른다. dx1의 unit vector(크기가 1임)

그런데 그것을 n개에 하니까 

분산 : (데이터-평균)**2/n 이므로 그걸 저 wTX에서 계산하는 것이다. (여기서는 평균이 0이 되었기때문에 제곱만 해줌)

그럼 ㅓ 식을 저 우변처럼 쓸 수가 있고, 저기서 1/n*XXT를 covariance matrix S라고 부름.

즉,  w라는 unit vector에 원래의 데이터를 프로젝션한 후 새로운 좌표들의 variance는 wT*1/nXXT*w가 되는 것이다.

w는 unit vector이기 떄문에 wTw=1이라는 조건도 붙음

우리의 목표는 저 분산값(variance) wT*1/nXXT*w를 최대로 하는 w(빨간색선 ,축)를 찾는 것이다.

그래서 S를 고유값분해를 해서 나오는 가장 큰 고유값 ㅅ에 해당하는 고유벡터 v를 찾는 것이다.

저 고유벡터를 first principal component라고 부르는데, 

v1은 unit vector이므로 저 4번째 식이 된다. ㅅ(람다)는 분산?이다

 

그럼 얼마나 많은 주성분을 사용해야 할까?

너무 1차원 벡터로만 축소하면 정보손실이 있을 수 있으니 적당히 많은 분산을 사용해야함.

PVE(proportion of variance explained) : 모든 주성분들(ㅅ1,ㅅ2,ㅅ3,..ㅅd)중 k번째 주성분(principal component)가 설명하는 분산(ㅅk)의 비율이다. 

저 오른쪽 그림(scree plot)의 elbow point(기울기가 급격히 꺾이는 지점, 더이상 꺾이지 않는)를 찾는 식으로 

저 elbow point를 지나고 나면 principal component를 추가해도 별로 이득이 없는 것이다.

또는 미리 정한 크기의 분산을 설명하는 가장 작은 components를 사용.

 

또한 시각화를 하기 위해서는 2차원,3차원으로 축소를 해야 하므로 principal component를 2개 또는 3개를 사용.

 

유명한 예시 eigen face

사람 얽루 이미지를 여러개를 모은 후 PCA를 진행해서 principal component를 얻고 원래의 데이터를 이 principal component들에 프로젝션을 하면 각각의 component에 대한 좌표값을 얻을 수 있음. 즉, principal component의 weighted sum으로 나옴.

PCA의 한계점

- PCA를 하고 나서 저차원의 데이터로 classification을 할 때 별로 도움이 되지 않을 수 있다.(데이터 분포가 퍼져있으면 ..)

- variance를 보존하기 위하기 때문에 유의미한 정보를 뽑지 못할 수도 있음.

PCA 한계점 극복 - 1. Multidimensional Scaling(MDS), 2. t-SNE

- MSE : 분산을 보존하는 것이 아닌 데이터간의 거리를 보존하는 차원축소법

X 행렬에서 시작하는 게 아니라 데이터 간의 거리 distance matrix D를 계산

d차원으로 차원 축소를 하고 싶을 때 X행렬(d차원의 좌표를 가진 n개으 ㅣ행렬)을 B로부터 계산.

- PCA와 달리 곧바로 d차원의 좌표를 계산

- tSNE(t Distributed Stochastic Neighbor Embedding)

MDS는 Distance 행렬을 계산하는데, t-SNE는 local neighborhood를 잘 보존하면서 차원축소를 하는 방법

- 가까이 있는 데이터들인 neighbor를 확률적으로 정의함(가우시안 분포)으로서 neighborhood를 보존한다.

- t-SNE는 SNE를 개선해서 차원축소 이후에 neighbor일 확률(qj|i)가 가우시안 분포에 비례하는 것이 아닌 t-Distribution에 비례한다고 가정하는 방식이다. 

저 SNE와 t-SNE 모두 p와 q의 분포를 같아지도록 하는 y를 학습한다.

 

차원 축소법의 구현 예시(sckit learn)

유방암 데이터셋- 비지도학습 할거기 때문에 X_cancer만 사용, X_cancer.shape은 560,30으로 이미지도 아닌데 30차원이나 됨.

과일 분류 데이터셋 - X_fruits만 이용

 

유방암 데이터셋부터 PCA 시작

PCA하기전에 데이터를 표준화해야함(StandardScaler)

PCA(n_components = 2)이므로 2차원으로 축소됨.

X_pca = projection된 input feature들

 

과일데이터셋

PCA는 분류에 최적화된 게 아니라 데이터들의 분산을 보존하는데 최적호되어있다.

같은 class끼리 분류가 잘 되지는 않는다.

 

MDS - 데이터 간 거리 보존

t-SNE 

- S:stochastic 랜덤한 어떤 확률적 요소가 있음.

PCA, MSE, t-SNE 로 분류를 한 건데 t-SNE가 가장 분리가 잘 되었다. 

저렇게 분리를 잘 해놓으면 decision tree를 썼을 때도 box별로 잘 분할이 된다. 좋은 classification 결과를 얻을수 있음.

unsupervised learning으로 데이터 처리를 잘 해주면 supervised learning도 잘 진행할 수 있다는 것을 볼 수 있음.

 

Clustering(군집화) - unsupervised learning

- 데이터셋 안에서 군집을 찾는 것, 동일한 군집끼리는 유사, 다른 군집은 다른 데이터

- classification : 각 데이터의 클래스를 사전에 알고 있고, 새로운 데이터의 class를 예측

- clustering : 각 데이터의 class를 알지 못하는 상태에서 최적의 구분을 예측

활용

유사이미지 추천, 기사추천, 주식종목 특성

군집화 알고리즘의 종류

군집화 방법에 따라 3가지 1 Partitioning (부분적) 군집을 부분별로 나눔/ 2 Hierachical(계층적) 군집이 계층구조, Dendogram 군집화 순서를 나타내는 그림/ 3 Density-based 클러스터링(밀도 기반으로 임의의 군집을 찾음. 밀도가 높은 지역이 어떤 클러스터를 형성)이 있음.

 

- Hard Clustering, Soft Clustering도 있는데 한 데이터가 하나의 군집에만 속할지 여러 군집에 동시에 속할지

오늘 볼 것은 Hard Clustering임

1. Partitioning Clustering - 대표적인 알고리즘 K Means Clustering

- 직관적이고 구현이 간단

- 각 클러스터들이 중심=centroid=데이터들의 평균를 가진다.

각 데이터는 가장 가까운 점에 할당이 되며 같은 중심에 할당된 개체들이 하나의 군집을 형성.

- 실행 이전에 군집의 갯수 K가 정해져야 한다.

C1 C2 C3는 공집합이 하나도 없는 겹치지않는 부분집합들이다. 얘네들을 partition이라고 부르는데

 각 클러스터 안에서 input feature의 dimension이 p라고 했을 때 각 dimension의 input feature와 한 군집 안에 속한 그 feature의 평균의 차이 = Squared Error가 됨. 한 군집 안에서 모두 더해주고 이를 클러스터의 크기로 나누어서 한 클러스터 안에서 squared error의 평균값을 구하고 이를 모든 클러스터에 대해 다시 더해주는 형태.

- 감으로 k를 잡을 순 없으니 SSE를 가지고 K를 정하는 룰이 있다.

 

K clustering에서 k를 정하는 규칙

k가 매우 많아져서 최종적으로 군집 수가 전체 데이터개수와 같아지면 각 중심이 데이터랑 같아지게 되서 SSE가 0이 된다. 여기서도 SSE가 급격히 줄다가 완만하게 주는 지점이 생긴다. 그 elbow point에서 K를 정하는 게 좋다. 

K Means Clustering 절차

- k를 먼저 정해져있다고 가정하고, 맨 처음에는 assignment과정. 각 데이터에 랜덤하게 하나의 군집을 할당.

- assignment가 바뀌지 않을 떄까지 아래 두 과정을 반복

 2-1. 각각 군집에서 centroid를 계산

 2-2. 각 데이터에서 가장 가까운 중심에 해당하는 군집으로 assignment를 다시실행.

K Means Clustering 의 한계점

- 초기에 K를 정해야하고, 각 군집의 크기,밀도가 다르거나 구형이 아닌 경우 결과가 잘 안나온다.

 

K Means clustering의 단점 보완 - Agglomerative Clustering

- 비슷한 데이터를 차근차근 묶어주고, k를 미리 정할 필요가 없음.

수행절차는 아래 피피티에 나와있음. 거리가 가까운 군집끼리 묶고 묶고 해서 하나의 군집으로 결합될떄까지 진행.

k를 정할 필요가 없고 덴드로그램에서 어디서 자를지만 정하면 된다.

 

Agglomerative Clustering의 여러 결합=linkage 방식(거리 계산 방식에 따라 - min, max, average, between centroids 방식이 있음.)

Agglomerative Clustering의 한계점

- 계산복잡도가 너무 크다.

- 한번 잘못 군집화하면 되돌릴 수 없다.

- linkage type에 따라 장단점 존재, 예를들어 max 의 경우 노이즈에는 강인하지만 다른 크기의 군집에 취약.

 

DBSCAN (Density based Clustering)

- 조금 더 복잡하지만 앞선 알고리즘이 해결하지 못하는 클러스터링 가능

- 데이터 density가 높은 영역과 그렇지 않은 영역을 구분.

density= 일정 반지름 입실론E 안에 (원 안에) data point 갯수 (원 안에 data가 3개 있으면 density는 3) = 어떤 점을 기준으로 density를 셀 때는 자기자신 빼고 센다.

neighborhood = 두 data point간의 거리가 반지름 입실론E 이하인 경우

core point = 반지름 입실론 안에 min 포인트개 이상의 데이터를 포함하고 있는 data point 

border point = 반지름 입실론E안에 minpts개 이상의 데이터를 포함하지만 corepoint와 neighborhood인 point (저 그림에서 X 표시된 왼쪽 점)

noise point = core point, border point 모두에게도 속하지 않는 point

 

density edge = 두 data point가 neighborhood인 경우 둘 사이에 density edge를 가짐.

density connected = 두 data point가 edge들을 통해 연결되는 경우(q-p1-p) 엣지 두개로 연결됨. 예를들어

 

DBSCAN의 수행절차

1. 모든 datapoint의 core, border, noise중 하나로 라벨링.

2. noise point를 없앤다.

3. 군집에 assign 되지않은 모든 core point x에 대해 다음 반복

 3-1. point x 및 point x 와 density-connected 된 모든 point들에 대해 새로운 군집을 assign

4. border point는 가장 가까운 core point의 군집으로 assign

 

DBSCAN 수행 예시

- 다양한 모양의 군집 다룰 수 있음. 노이즈가 있어도

- 단 각 군집의 density가 다를 경우 클러스터링이 어려울 수 있음.

 

Clustering 세 가지 유형 클러스터링 예시. () scikit learn의 make_blobs함수로 만든 데이터 활용

맨 왼쪽 : raw data, 가운데: 노이즈 추가, 오른쪽: 노이즈 추가

1. K-Means 클러스터링 - sckitlearn의 KMeans 함수? 사용

구형 데이터(raw data)의 경우는 잘 클러스터링되지만, 저렇게 노이즈가 껴있는 데이터는 아래처럼 잘 클러스터링 되지못함.

아래 그림처럼 노이즈가 껴있으면 클러스터링이 잘 안됐다. k=2로 놓고 했는데 같은 형태의 데이터집단이 잘린 모습. centroid 사이의 거리로 계산을 하기 때문에 그렇다.

 

 

 

2. Agglomerative Clustering - sckitlearn의 AgglomerativeClustering 활용, hierachy의 덴드로그램 볼 수 있음.

얘도 마찬가지로 노이즈가 있는 데이터에 대해서는 클러스터링이 잘 이뤄지지 않음. k means보다는 살짝 나은듯

왜냐하면 linkage를 하는 게 결국에는 거리 기반이기 떄문에 하프문 형태나 동심원 형태에서는 좋은 결과 X

3. DBSCAN - sckitleran 의 DBSCAN

원의 반지름인 입실론, dense region을 정의하는 MinPts의 갯수를 넣어줘야함.

그래도 노이즈있는 데이터의 클러스터링이 잘 됨. 그러나 노이즈가 저 하프문모양에서는 연결하듯 생겨버려서 하나의 군집으로 묶여버림. 그러나 동심원 형태는 매우 잘 됨.

같은 파라미터로 데이터 다시 임의로 생성하면 아래와 같이 클러스터링을 잘 한다.

 

클러스터링 3가지 외에도 여러 방법이 있다. - DBSCAN이 SOTA?같은 느낌.

unsupervised 요약

- 차원축소 - PCA, MDS< t-SNE / 클러스터링 - Kmeans, Agglomerative, DBSCAN