머신러닝/[패스트캠퍼스]머신러닝&AI 첫걸음 시작하기 : 머신러닝 인강

[자기계발챌린지] 패스트캠퍼스 KDC 머신러닝 - 머신러닝&AI 첫걸음 시작하기 : 머신러닝 인강 5주차 : 군집분석 & 불균형 데이터 다루기

uomnf97 2021. 12. 14. 16:01

안녕하세요~ 

패스트캠퍼스 교육생 제이덥입니다!

오늘은 "머신러닝 개요" 5주 차 강의를 듣고 

배웠던 부분과 더 공부해야 할 부분들을 포스팅을 통해 점검해볼까 합니다. 

.

.

"먼저 포스팅 관련 내용은

[KDC] 패스트캠퍼스 머신러닝& AI 첫걸음 시작하기 강의를 토대로 작성되었음을 알려드리며, 

자세한 공부 하기를 원하시는 분들은 패스트캠퍼스 강의를 수강하시기 바랍니다!"

.

.

오늘은 마지막 5주 차에 접어들었습니다. 

마지막에는 군집분석 방법과 1주 차에 언급해주셨던 Class imbalanced problem과 그에대한 해결법

그리고 인 Over Sampling, Under Sampling Hybrid Sampling에 대해서 공부를 하였꼬

특히 Over sampling 중 SMOTE 기법에 대해서 중점적으로 다뤄 봤습니다 ㅎ

그리고 다양한 실습!으로 구성된 수업을 들었네요..!

그럼 내용을 간략하게 알아볼까요..?!

 

군집분석은 비지도 학습의 하나로 말 그대로 여러 군집으로 나눠주는 작업을 말합니다. 

군집의 특성이 비슷한 것끼리 분류를 해주는 작업이라고 생각해주시면 됩니다...!

다만, 그럼 Classification과 차이는 뭐지...?

라고 생각하시는 분들이 계실 텐데요...!

 

차이점은 바로 Label 즉, 분류할 class가 미리 정해져 있는가입니다...!

우리가 classification을 하게 되면 그게 2가지로 분류되는 것인지, 3가지인지 정해져 있었는데요...!

예) 개, 고양이 사진 분류기 등

군집화는 이렇게 분류군이 정해져 있지 않고 학습을 진행하며

데이터의 유사성을 바탕으로 기계가 스스로 분류해나갑니다.

 

그래서 군집을 하는 방법에 따라 여러 알고리즘으로 나뉘는데

강의에서는 가장 많이 쓰이는 세 가지 분류법으로 나눴습니다.

K-means Clustering, Hierachical clustering, DBSCAN입니다!

 

K-means Clustering 은 사용자가 정해준 K개의 군집으로 분류하는 알고리즘입니다. 

이 알고리즘의 가장 큰 특징은 임의로 데이터 포인트를 잡아 중심점을 잡고 중심점에 가까운 점들로 군집을 만들어줍니다.

그리고 군집 좌표의 평균(mean)을 새로 만들어 주고 해당하는 중심점을 이용해서 다시 군집을 만들어줍니다.

이런 방식으로 "군집화 - 새로운 중심점 계산 - 군집 업데이트"의 과정을 반복하여 

군집 업데이트 전/후 군집의 모양의 차이가 없을 때 학습이 종료됩니다.

 

이 방법의 가장 핵심은 "거리"인데요. 점으로 표현된 거리는Manhattan Distance 혹은 Eucliean Distance를 이용해서 거리를 정해주고 이 거리를 바탕으로 Elbow method, Silhouette method를 통해서 군집화를 진행해줍니다. 그럼 아래 그림과 같은 군집이 만들어집니다.

K-means 예시( 실습을 진행하며 만든 출력 창)

이 군집화는 치명적인 단점이 있는데요. 

바로 차원이 높아질수록 데이터를 잘 분류할 수 없고, 이상치에 민감하다는 점, k라는 하이퍼 파라미터를 정해주는데 어려움이 있습니다. 

또한 밀도 기반의 나선 모형으로 분포되어있는 데이터의 군집화가 힘들기도 하다는 점입니다. 그리고 또 초기로 설정해주는 점이 

최종 결과에 매우 큰 영향을 준다는 점도 단점이 되겠네요. 

이상치에 민감한 것을 보완한 중간점을 중심점으로 쓰는 K-medoids clustering도 있지만 

K-means는 실제로 많이 쓰이는 방법은 아니기에 이 정도가 있다 정도만 알고 넘어가도록 할게요!

 

다음은  Hierachical clustering입니다!

이 군집화는 개체들 사이에

"유사도 행렬을 계산- 클러스터 형성 - 군집 간 유사도 행렬 다시 계산"

하는 방식으로 계층을 형성해나가며 군집화를 하는 방식입니다. 

 

위에서부터 해석할 수 있으며, python에 denogram을 통해 시각화가 가능하다는 점이 가장 큰 특징이며

군집 개수를 정해주지 않아도 된다는 장점이 있네요~

실습 내용에서 Denogram 캡처

마지막은 DBSCAN 군집화 알고리즘입니다~

DBSCAN에서 eps-neighbor 그리고 MinPts를 두 가지 parameter를 사용해서 군집화를 진행합니다. 

한 점에서 epsilon 이내의 거리의 점들이 MinPts 이상의 점들이 있을 때 계속해서 같은 군집으로 만들어 주는 방식입니다. 

따라서 MinPts 미만의 점들이 있다면 이상치로 내버려 두고 군집화를 진행하여 

이상치에 강한 모델인 동시에 outlier를 Detect 하는 작업에도 쓰인다고 합니다.

DBSCAN 군집화 실습 모형 사진 데이터 Iris 데이터

밀도를 기반으로 하는 군집화에도 강하고,

군집의 개수를 설정할 필요가 없다는 점

이상치에 강하다는 점 때문에 

좋은 군집화 모델이라고 평가가 되는데요. 

다만 eps거리에 모델의 성능이 많이 달라진다는 단점이 있지만, 

충분한 실험으로 보완 가능하다고 합니다 :)

 

다음은 class imbalance 문제에 대해서 알아보겠습니다.

이전에 강사님께서 살짝 언급하신 문제인데 

문제 상황은 이렇습니다. 

분류를 할 때 (예를 들면 반도체 공정, 제품 공정) 등에서 불량을 예측한다고 가정한다면

불량의 수보다 정상제품 수가 압도적으로 많기 때문에 

정상제품에 대해 overfitting이 되어 올바르게 고장 난 제품을 분류하지 못하는 것입니다. 

이런 부분에서 문제가 되는 건, 제품 공정처럼 

제품이 출시됐을 때 불량제품이 시장에 나갈 경우, 

혹은 오류에 민감한 시스템에서 예측을 해야 되는 상황에서 매우 critical 하게 나타납니다. 

 

조금 더 깊게 들어가면 IR이라고 한 수치(majority ratio/minority ratio)가 매우 높은 상황이며

소수의 데이터가 올바르게 학습되지 않고, 예측 확률 값이 threshold에 많이 민감한 모델이 되어 버립니다. 

 

그리고 이번 수업에서는 이런 문제를 해결하기 위해 

Oversampling, UnderSampling, Hybrid Sampling을 집중적으로 보았는데요. 

 

Oversampling은 소수의 데이터를 부풀리는 방법입니다. 

train set/validation set을 나누고 난 뒤에 trainset에 적용시켜주는데 

Random Over Sampling과 SMOTE 기법이 있는데

SMOTE 기법을 다양하게 변주해서 많이 사용한다고 합니다.

Minority 데이터에 KNN을 적용한 SMOTE 기법

Borderline을 콘셉트로 하여 만들어준 BLSMOTE기법

DBSCAN을 이용하여 이상치를 걸러내 줄 수 있는 DBSMOTE 기법입니다...!

그리고 현업에서는 이 Oversampling을 다른 sampling보다 많이 사용한다고 하네요. 

 

다음은 UnderSampling인데요, 이건 학습 데이터의 Majority 데이터를 줄여주는 방법입니다. 

하지만 True 데이터를 줄이는 효과를 가져와 속도가 빠르긴 해도 성능을 보장할 수는 없는데요. 

Random Under Sampling, Tomek Links, 그리고 EasyEnsemble 등의 방법이 있다고 합니다~

 

마지막은 Hybird Sampling입니다. 앞서 만들어준 두 가지 기법을 짬뽕하여 사용하는 것인데요. 

강사님께서 페이퍼를 작성하시고 있는 기법을 설명해주셨습니다. 

컨셉을 간단하게 말하면 Classify를 명확하게 해 주어 성능을 높이는 작업인데, 

소개해준 기법들 중 제일 성능이 좋아서 조금은 놀랐었네요. 

만약 이 방법이 궁금하시면 강의를 듣는 걸 추천해드릴게요~

 

 

아쉽게도 학습과정에서 가중치를 조절해주는

Cost-sensitive learning에서는 배우지 못했지만 

Resampling을 더 많이 사용한다고 하니 여기까지 만족해야겠습니다...! 

이번에서 코딩 실습은 직접 코딩을 작성하기보다는 

작성된 코드를 분석하는 실습과 함께 

파라미터 값을 변화시켜보며 이론적인 이해를 돕는 학습으로 진행되었습니다. 

특히, 마지막 실습은 기존에 배웠던 내용을 다시 사용하기도 했고(Bagging, RandomForest)

데이터 분석부터 모델링에 이르는 전반적인 부분까지 실습을 진행했었습니다..!

그리고 최종 프로젝트를 마무리하며 모든 실습을 마치었습니다...!

P.S imblearn을 pip로 나눠서 사용해주었고, HDBSCAN과 같은 경우 설치를 했을 때 numpy관련 오류가 나기도 했습니다. 

만약 같은 문제가 생기시는 분들은 아래 깃헙을 참고해서 install을 해주면 됩니다. 

또 SMOTE를 사용하실 때 ratio로 오류가 나신다면 sampling_strategy로 바꿔주시고 

fit_sample()에서 오류가 난다면 fit_resample로 바꿔주시면 됩니다. 

최종 프로젝트를 kaggle에 제출해본 사진과 기타 실습과정에서 캡처한 내용입니다.

.

.

.

이걸로 마지막 주차 5주 차 블로그 포스팅을 마치네요...!

다시 돌아올 그날을 기약하며

모두 좋은 하루 보내세요~

추운 겨울 건강 조심하시고요~

파이팅!

 

 

 

출처 :

1) 패스트 캠퍼스 : https://fastcampus.co.kr

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

2) 강사님 : 이경택 강사님