Joonas' Note

Joonas' Note

[ML] 사이킷런(scikit-learn) 클러스터링 비교 본문

AI/머신러닝

[ML] 사이킷런(scikit-learn) 클러스터링 비교

2022. 5. 29. 16:15 joonas

    시작하기 앞서

    sklearn에서는 다양하고 많은 클러스터링 module들을 제공한다.

    https://scikit-learn.org/stable/modules/clustering.html

     

    공식 문서에서도 여러 데이터 분포에 대해서 비교한 것이 있길래 직접 해보고자 했다.

    sklearn에서는 make_blob과 같이 데이터를 생성해주는 함수가 있다. 범위와 분포값을 설정해서 임의로 만들 수 있지만, 이것은 사용하지 않기로했다.

    데이터 만들기

    현실에서는 이렇게 고른 분포가 나오기 힘들다고 생각했고, 2차원 평면 상에서 직접 데이터를 만들기로 했다.

     

    GUI tool to create points for clustering

     

    www.joonas.io

    https://www.joonas.io/cluster-paint/

    캔버스와 마우스 이벤트를 이용해서 그림판처럼 데이터를 그릴 수 있게 했고, csv로 (x 좌표, y좌표, 색상 번호)를 추출할 수 있도록 간단하게 만들었다.

    데이터셋

     

    Clustering Exercises

    Clustering Using Methods You Know

    www.kaggle.com

    그렇게 만든 데이터 셋이다.

    어디까지나 클러스터링 함수들을 테스트해보고, 비교하고자하는 목적이었으므로 데이터 셋의 정확도는 크게 중요시하지않았다. 직접 만든 데이터는 이렇게 생겼다.

    포인트의 크기가 커서 그림에서는 뭉쳐보이는 케이스들이 조금 있다. (boxes, supernova 등)

    30개의 테스트케이스가 있고, 전체 포인트의 개수는 19만개이고, 한 테스트케이스에는 최소 500개, 최대 2만개의 포인트가 있다.

    캐글 노트북

     

     

    sklearn clustering methods baseline

    Explore and run machine learning code with Kaggle Notebooks | Using data from Clustering Exercises

    www.kaggle.com

    평균 처리 속도와 전체 소요 시간은 아래와 같다.
    총 소요 시간은, 모든 테스트케이스의 클러스팅을 수행하는 데 걸린 시간이다.

    알고리즘 item(s) per seconds 총 소요 시간
    K Means 7683.81 26초
    DBSCAN 27007.61 1분 38초
    Mean Shift 94.74 48분 44초
    Spectral Clustering 1318.70 4분 36초
    Gaussian Mixture 22663.75 8초
    Agglomerative Clustering 4475.49 1분 25초
    OPTICS 797.21 5분 51초
    BIRCH 4277.72 51초

    OPTICS는 무언가 잘못 측정한 것 같다. 엄청나게 많은 데이터를 아예 분류조차 하지 못했다. (노트북에서 검은색 포인트로 확인할 수 있음)

    그나마 괜찮은 결과인 K Means와 Spectral Clustering의 결과를 비교한 것이다.

    K Means가 굉장히 빠른 데 비해 정확도도 꽤 괜찮은 편이지만, 평균 거리를 두고 묶다보니 태극 마크에서 한계가 잘 보이는 모습이다.

    다른 알고리즘들도 최대한 최적의 환경을 주고 시간과 정확도를 비교하였지만, 이상적인 알고리즘은 찾지 못했다.
    그런 의미에서 이 노트북은 더욱 의미가 있어 보인다.

    데이터 분포를 먼저 확인하고 더 나은 것을 선택해야하는 데, 이 노트북을 통해서 어떤 분포에 어떤 알고리즘이 유리한 지 그나마 먼저 알아볼 수 있기 때문이다.

    마치며

    정확도까지 표시하고 싶었으나, 대부분의 알고리즘들이 레이블을 아무거나 붙이기 때문에, 기존에 분류한 레이블과 어떻게 일치하는 지를 확인하기가 어렵다. 정답 데이터는 [0, 0, 0, 1, 1, 2, 2] 인데, 클러스터링 결과가 [1, 1, 1, 2, 2, 0, 0] 일 때 이것이 100% 인지 계산하는 것은 정확하지 않기 때문이다.

    Comments