(7) 비지도 학습
지도학습의 경우 정답값이 있는 학습 방법으로, feature들과 target간의 관계를 파악하면서 학습을 진행한다. 하지만 정답이 없는 경우는 데이터가 가지는 특징만으로 분류를 해야한다. 이럴때 사용하는 것이 비지도학습이다.
1-1 군집화와 차원축소
비지도학습은 정말 다양한 방법들이 있지만 우리는 그 중에서 군집화(Clustering)
와 차원축소(Dimensionality Reduction)
를 다뤄보도록 하겠습니다. 아마 여러분들이 데이터분석을 하게 될 때, 가장 많이 사용하게 될 녀석들일 거예요!
배우고 실습하기 전에, 군집화는 무엇인지, 차원축소는 무엇인지 알 필요가 있습니다.
문제
아래의 링크를 보고, 군집화와 차원축소가 무엇인지 각각 여러분만의 언어로 정리해주세요!
1) 클러스터링(군집화)
클러스터링이란?
레이블이 없는 데이터셋을 그룹화하는 것을 클러스터링이라고 한다. 만약 레이블이 있는 데이터셋을 그룹화한다면 지도학습의 일종인 분류가 된다. 데이터셋을 그룹화하려면 유사한것들끼리 묶어야한다. 이를 위해 데이터셋의 특성 데이터를 유사성 측정이라는 측정 항목을 사용으로 결합해서 데이터들 간의 유사성을 측정할 수 있다.
클러스터링의 사용 예시
시장 세분화, 소셜 네트워크 분석, 검색결과 그룹화, 의료영상, 이미지 세분화, 이상 감지
클러스터링을 하면 각 클러스터에 클러스터 ID 라는 번호가 할당된다. 클러스터 ID가 할당되면 예시용 전체 특성 세트를 클러스터 ID로 압축할 수 있다. 이를 통해 복잡한 예를 간단한 클러스터 ID로 표현하면 클러스터링이 강력해진다. 대규모 데이터셋의 처리를 간소화할수있다.
클러스터링 출력은 다운스트림 ML 시스템의 특성 데이터 역할을 합니다.
일반화
클러스터의 일부 예시에 특성 데이터가 누락된 경우 클러스터의 다른 예시에서 누락된 데이터를 추론할 수 있다.
데이터 압축
클러스터의 모든 예시에 대한 특성 데이터는 클러스터 ID로 대체할 수 있다. 이 과정을 거치면 대체로 특성 데이터가 간소화되고 저장장소가 절약된다. 데이터셋의 규모가 커지면 커질수록 이러한 이점들이 두드러진다. 또한, 머신러닝 입력 데이터로 전체 특성 데이터셋 대신에 클러스터터 ID를 사용할수있다.
개인정보 보호
사용자를 클러스터링하고 사용자 데이터를 특정 사용자 대신 클러스터 ID와 매칭해서 개인 정보를 보존할 수 있다. 사용자 데이터로 사용자를 특정할 수 없도록 클러스터는 충분한 수의 사용자를 그룹화해야한다.
2) 차원 축소(Dimension reduction)
차원 축소란 머신러닝이나 통계분야에서 활용되는 기술로 문제의 무작위 변수(random variable)의 규모를 줄여서 주요한 변수의 집합을 구하는 것이다. 차원 축소는 두 과정으로 이루어지는데 첫 번째는 변수 선택(feature selection)과 변수 추출(feature extraction)이다. 변수 선택 과정에서는 모델을 대표할 다차원 데이터의 집합에서 특성들의 작은 부분집합들을 필터링, 임베딩, wrapping을 통해 선택한다. 변수 추출 과정에서는 데이터셋의 차원을 줄여서 변수를 모델화하고 구성 요소들에 대한 분석을 수행한다.
- 차원 축소의 방법들
- Factor Analysis
- Low Variance Filter
- High Correlation Filter
- Backward Feature Elimination
- Forward Feature Selection
- Principal Component Analysis (PCA)
- Linear Discriminant Analysis
- Methods Based on Projections
- t-Distributed Stochastic Neighbor Embedding (t-SNE)
- UMAP
- Independent Component Analysis
- Missing Value Ratio
- Random Forest
Filter Method& Wrapper Method
Filter Method
Machine Learning 과정에서 Best Feature Subset 을 주는 것이 아니라, 사용자에게 feature-rank를 줌으로 각 feature의 영향력을 알려주는 방법이다. 따라서 해당 모델에 Best Feature Subset 은 아닐 수 있더라도, 도움이 된다고 볼 수 있다. 또한 여기서 각 ranking 화 한 Feature 들은 독립변수로 본다.
Wrapper Method
Machine Learning의 예측 정확도 측면에서 가장 좋은 성능을 보이는 Subset을 뽑아내는 방법이다. Machine Learning 을 진행하면서 Best Feature Subset을 찾아가는 방법이기 때문에 시간과 비용이 매우 높게 발생한다. 하지만 최종적으로 Best Feature Subset을 찾아주기 때문에 모델의 성능을 위해서는 적절하다. 물론, 해당 모델의 파라미터와 알고리즘 자체는 완성도가 높아야 제대로 된 Best Feature Subset을 찾을 수 있다.
- Forward Selection(전진 선택) : 변수가 없는 상태로 시작하며 반복할 때마다 가장 중요한 변수를 추가하여 더 이상 성능의 향상이 없을 때까지 변수를 추가한다.
- Backward Elimination(후방 제거) : 모든 변수를 가지고 시작하며, 가장 덜 중요한 변수를 하나씩 제거하면서 모델의 성능을 향상시킨다. 더 이상 성능의 향상이 없을 때까지 반복한다.
- Stepwise Selection(단계별 선택): Foward Selection 과 Backward Elimination 을 결합하여 사용하는 방식으로, 모든 변수를 가지고 시작하여 가장 도움이 되지 않는 변수를 삭제하거나, 모델에서 빠져있는 변수 중에서 가장 중요한 변수를 추가하는 방법이다. 이와 같이 변수를 추가 또는 삭제를 반복한다. 반대로 아무것도 없는 모델에서 출발해 변수를 추가, 삭제를 반복할 수도 있다.
1-2 K-Means
가장 고전적이면서 직관적으로 이해하기 쉬운 군집화 기법입니다. K-Means는 다음과 같은 과정을 통해 군집화가 이루어져요!
임의의 중심점 설정
처음엔 임의의 장소에 사전에 설정해준 군집의 수(k)만큼의 중심점을 배치해줍니다. 그리고 일단 가장 기본적으로 이 중심점을 기준으로 데이터들을 군집화 하게 됩니다.
위쪽에 있는 초록색 중심점과 가까운 데이터들은 초록 중심점 소속으로,
아래에 있는 노란색 중심점과 가까운 데이터들은 노랑 중심점 소속으로
각각 구분이 된다는 것이죠.
그러나 저 중심점의 위치가 과연 정말 최적의 위치일까요? 데이터들을 좀 더 잘 구분하려면 *"중심이 데이터들의 가운데"* 에 있어야 합니다.
가운데로 가기 위해서, 중심점은 데이터와 본인과의 거리를 계산하면서 점점 데이터의 중심으로 이동하기 시작합니다.
평균의 중심으로 중심점 이동
각 데이터와 중심점간의 거리를 나타낸 그림입니다. 이 중심점까지의 거리가 평균적으로 비슷할 때까지 중심점을 이동시키는 것이죠.
중심점이 이동되면, 이동한 중심점에 대해 데이터들의 소속 또한 다시 새롭게 정의됩니다. 지금의 그림에선 나타나지 않지만, 이동하기 전에는 초록색 중심점 소속이었지만, 이동하고 나서는 노란색 중심점 소속일 수도 있다는 것이죠.
보시면 초록색 점이 그나마 데이터들의 중심으로 이동했습니다. 이런 식으로 계속해서 중심점을 이동시킵니다.
중심점 확정 및 최종 군집화
위와 같은 방법으로 중심점은 계속 반복해서 이동합니다. 언제까지 이동하냐구요? 이동해도 그 위치일때까지요!
중심점을 이동하다보면,,
이렇게 거리를 계산해서 이동시켜도 더 이상 움직이지 않는 순간이 생깁니다.
이 순간의 중심점을 최종 중심점으로 잡고, 그 순간의 데이터들의 소속 또한 최종 소속으로 잡는 것이죠. 이렇게 군집화가 이루어집니다.
그럼 우리가 원했던 군집화가 이루어지는 것이죠.
1-3 실루엣 계수
위에서 우리는 군집이 잘 형성되었는지 groupby
와 시각화를 통해 확인했습니다. 과연 이 방법이 최선일까요?? 우리가 분류와 회귀에서 metric을 통해 모델의 성능을 측정했던 것처럼, 얼마나 잘 묶였는지
를 측정하는 지표는 없을까요?🤔
실루엣 계수
를 소개합니다. 실루엣 계수는 쉽게 말씀드리면
군집 내의 데이터끼리는 얼마나 잘 뭉쳐있는지, 다른 군집의 데이터와는 얼마나 멀리 떨어져 있는지
를 측정한 지표라고 생각하시면 됩니다.
측정하는 방법을 간단하게 말씀드릴게요!
저기서 초록색으로 표시된 데이터를 i번째 데이터라고 했을 때,
같은 초록색 군집에 속해있는 데이터들과 i번째 데이터와의 거리의 평균을 a(i) 라고 하고,
주황색 군집에 속해있는 다른 데이터들과의 거리의 평균을 b(i) 라고 하는 것이죠.
그럼 직관적으로 "군집내부 데이터끼리 얼마나 잘 뭉쳐져있고, 다른 군집의 데이터와는 얼마나 잘 떨어져있는지"를 나타낼 수 있게 되는 것입니다!
이렇게 나온 실루엣 계수(Silhouette Coefficient)는 -1~1 사이의 값을 가집니다. (정규화 과정을 거쳐서 그래요!)
- 1일 수록 좋지 않은 것이며, 1일 수록 군집화가 잘 수행된 것입니다.
0이 서로 다른 군집끼리 가까운 것을 의미하는데, 실루엣 계수가 -값을 가진다는 것은.. 군집끼리 서로 영켜있다~~ 라는 말이 되겠죠. 상당히 좋지 않은 경우입니다.
또 하나 주의해야 하는 것이..
실루엣 계수가 무조건 크다고 해서 "오.. 대박"할 수도 없는 게
개별 군집의 실루엣 계수가 높게 나왔지만, 나머지 다른 군집들이 완전 말 그대로 망해버리는 경우가 있습니다. 평균의 함정에 빠져버릴 수 있는 것이죠.
이러면 평균값이 어느 정도 괜찮게 나올 수 있기 때문에.. 주의가 필요합니다. 예를 들어드리면,
이런 식이면, 파란색 군집의 실루엣 계수는 매우 높게, 잘 나올 것입니다.
그러나 주황색 부분의 군집들은 실루엣 계수가 나쁘게 나오게 나오겠죠.
이들의 평균을 구해보면 그럭저럭 꽤 괜찮은 실루엣 계수가 나와버릴 것입니다.
이런 경우가 있을 수 있기 때문에, 이 점을 유념한 채로 계수를 잘 봐야한다~~ 는 것입니다!
이러한 점때문에, 저는 실루엣 계수만을 이용한다기 보다는, 실루엣 계수와 위에서 했던 시각화 기법을 동시에 활용해서 판단합니다 ㅎㅎ 그게 다른 사람들을 설득할 때도 더 좋게 작용했던 것같아요!
🚩심화 문제🚩
K-Means는 각 데이터포인트들 간의 거리를 기반으로 군집을 형성합니다. 그러나 만약 아래와 같은 데이터에도 K-Means가 최선이라고 할 수 있을까요?
만약 K-Means를 적용하면 아래와 같은 결과가 나옵니다.
어... 잘 된 거 같지는 않죠? 위와 같은 데이터 분포에서 거리 기반의 알고리즘을 적용하면 제대로된 군집화가 이루어지지 않습니다. 그럼 어떻게 해야할까요?
거리 기반 외의 다른 군집화 방법이 필요합니다. 분량상 이 컨텐츠에서 코드까지 다뤄보지는 않을 거예요! 다만 알아두시면 군집화 작업이 필요하실 때 분명 유용하게 사용하실 수 있을 거예요.
수많은 군집화 기법 중 아래의 기법에 대해 설명해주세요. 어떤 방식과 과정을 통해 이루어지는지 요약해주시면 됩니다!
DBSCAN
GMM
계층적 군집화
2-1 차원축소
데이터는 많을 수록 좋습니다. 그러나 데이터를 설명하는 Feature가 너무 다양한 경우엔 오히려 모델의 입장에선 부정적인 영향을 줄 수 있습니다. 데이터를 묘사하는 것을 Feature라고 한다면, 데이터를 묘사하는 것이 너무 많으니, 오히려 혼란을 초래한다는 것입니다.
이러는 경우, Feature를 효율적으로 줄일 수 있는 방법은 뭐가 있을까요? 차원축소
기법에 대해 알아봅시다.
차원의 저주
차원의 저주란 데이터의 차원이 커질 수록 필요한 데이터의 수가 그만큼 증가하게 되고, 이에 따라 모델의 성능이 저하되는 현상을 말합니다.
또한 동시에 데이터 간의 거리가 벌어져 밀도가 희소해지는데(sparse), 이런 경우 거리에 기반한 알고리즘 성능이 매우 떨어지게 됩니다. 그림으로 보시죠!
위와 같이, 차원이 늘어나면 늘어날 수록 개별 데이터간 거리는 점점 멀어지는 것을 확인하실 수 있습니다. 이렇게 되면 거리에 기반한 알고리즘이 제 힘을 쓰기가 힘들겠죠?
그리고 피쳐가 많을 수록 피쳐가 다른 피쳐에 의해 설명 가능하게 되는 다중 공선성(Multicollinearity) 문제가 발생하게 될 가능성이 커지게 됩니다. 다중 공선성이라는 개념은 매우 중요합니다. Skill과 감을 잡는 데에는 사실 그렇게 주요하지 않지만, 더 엄밀하고 명확한 해석이 필요할 땐 중요하게 고려해야하는 요소이기 때문이죠. 우리는 일단 간단하게 익히는 것이 목표이기 때문에, 다중공선성에 대해 자세히 알고 넘어가진 않겠습니다.
어쨌든, 위와 같은 문제를 해결하기 위해 제시된 것이 바로 차원축소
입니다!
크게 2가지로 나뉘는데
1. Feature Selection
2. Feature Extraction
기법입니다. 1번 문제에서 이미 간단하게 개념을 보고 오셨으니 간단하게만 확인하고 넘어가겠습니다.
Feature Selection 은 말 그대로 필요한 피쳐만 선택하는 것입니다.
예를 들어, 어떤 데이터의 피쳐가
a,b,c,d,e,f,g 로 있을 때, 이 중 필요한 피쳐가 a,b 만 있으면 된다고 판단하면 그냥 a,b만 가져다가 쓰는 것이죠.
Feature Extraction 은 기존의 피쳐를 살짝 변형하면서 압축합니다. 피쳐 선택이 그냥 있는 것 "그대로" 골라오는 것이었다면, 피쳐 추출은 있는 것을 살짝 변형시키면서 압축을 시킵니다.
예를 들어, 어떤 데이터의 피쳐가
a,b,c,d,e,f,g로 이루어져 있을 때, 피쳐 추출을 하면 새로운 피쳐 A,B 로 이들을 압축하는 것이죠.
실생활에 가까운 예시를 들면, 학생을 평가할 때,
모의고사 성적, 내신, 수행평가, 수능, 봉사활동, 독서기록, 선생님 평가... 이런 다양한 피쳐들을
학업성취도, 커뮤니케이션 능력과 같은 피쳐들로 압축이 가능하다는 것이죠.
이런 식으로 피쳐 추출을 진행하게 되면 장점이, 새로운 의미를 도출해낼 수 있음을 의미합니다.
압축 되기 전엔 몰랐는데 압축되고 나니, 비로소 새로운 잠재적인 의미가 눈에 보인다는 것이죠. 이런 잠재적인 요소(Latent Factor)를 뽑아낼 수 있다는 장점 덕분에, 많이 사용되는 것이구요.
이 Latent Factor의 개념은 딥러닝에서도 매우 중요하게 작용합니다. 수많은 정보를 적절하게 요약하는 것. 딱 봐도 사용처가 매우 많을 것같지 않나요? ㅎㅎ
오늘 우리는 이 중 Feature Extraction 기법의 대표주자인 PCA를 사용하는 방법 대해 알아보도록 하겠습니다. PCA를 이해하려면, 공분산
, 고유벡터
, 고유값
에 대한 개념을 알고 계셔야해요! 분량상, PCA에 대한 개념 이해는 한 마디로 요약하면
입력 데이터의 공분산 행렬의 고유벡터와 고유값을 가지고 "기존 데이터 압축시키기"
라고 생각하시면 됩니다.
2. 다양한 함수들
KMeans
KMeans의 원형
*class* sklearn.cluster.**KMeans**(*n_clusters=8*, ***, *init='k-means++'*, *n_init='warn'*,
*max_iter=300*, *tol=0.0001*, *verbose=0*, *random_state=None*, *copy_x=True*,
*algorithm='lloyd'*)
n_clusters
인수는 k-means의 k를 의미하는 군집형성의 개수를 뜻한다.n_jobs
는 scikit-learn의 기본적인 병렬처리로 내부적으로 멀티프로세스를 사용하는 것이다.
만약 CPU 코어의 수가 충분하다면 n_jobs를 늘릴수록 속도가 증가한다.random_state
를 통해서 난수를 고정한다.
make_blobs
make_blobs
함수는 등방성 가우시안 정규분포를 이용해 가상 데이터를 생성한다. 이 때 등방성이라는 말은 모든 방향으로 같은 성질을 가진다는 뜻이다. 다음 데이터 생성 코드의 결과를 보면 make_classification
함수로 만든 가상데이터와 모양이 다른 것을 확인 할 수 있다. make_blobs
는 보통 클러스링용 가상데이터를 생성하는데 사용한다. make_blobs
함수의 인수와 반환값은 다음과 같다.
인수:
n_samples
: 표본 데이터의 수, 디폴트 100
n_features
: 독립 변수의 수, 디폴트 20
centers
: 생성할 클러스터의 수 혹은 중심, [n_centers, n_features] 크기의 배열. 디폴트 3
cluster_std
: 클러스터의 표준 편차, 디폴트 1.0
center_box
: 생성할 클러스터의 바운딩 박스(bounding box), 디폴트 (-10.0, 10.0))
반환값:
X
: [n_samples, n_features] 크기의 배열
독립 변수
y
: [n_samples] 크기의 배열
종속 변수
np.unique
unique 내에 리스트, np.array 자료를 넣어주면 된다. 배열의 고유한 원소들을 모은 뒤, 1차원 shape으로 변환하고 정렬한 결과를 반환한다. unique의 axis 옵션을 통해서 행이나 열 기준의 블록을 단위로 고유한 배열들의 집합을 구할 수 있다. numpy의 unique 함수에서는 각 고유 원소가 처음 등장한 위치인 index 정보와 각 값이 몇 번째 고유 원소에 매칭되는지에 대한 inverse 정보, 그리고 각 고유 원소가 등장한 총 횟수를 나타내는 counts 정보를 추가로 받을 수 있다. 각각 return_index, return_inverse, return_counts 인자를 True로 설정하면 튜플 형태로 unique 결과와 함께 위 정보들을 추가로 받는 것이 가능하다.