Jubatus의 클러스터링 기능을 사용해 봤습니다.

이 글은 Jubatus Advent Calender 15일째 되는 글이다.
Jubatus에는 많은 머신러닝 알고리즘이 설치되어 있습니다.
여기서 우리는 그다지 이용되지 않는 분류 기능에 착안하여 실현된 알고리즘과 그 특성 등을 살펴본다.

이른바 집합


컬렉션이란 데이터 간의 유사도 등 지표에 따라 데이터 컬렉션을 유사 데이터 그룹(컬렉션)으로 분할하는 기계 학습 방법이다.
정답 데이터 없이 활용할 수 있는 교사는 학습 없이 비슷한 데이터 세트를 추출해 SNS상의 화제 등을 추출하는 데 활용할 수 있다.

Jubatus에서 구현된 클러스터 알고리즘


주바투스는 2016년 12월까지 3가지 클러스터 알고리즘을 시행했다.
각 알고리즘을 간단히 설명하다.

K-Manas 알고리즘


이것은 분류 중의 대표적인 알고리즘 중의 하나다.
K-Manas는 미리 지정된 클러스터 수에 따라 데이터의 피쳐 공간에 클러스터의 무게 중심을 배치합니다.
데이터가 최적으로 분할될 때까지 중심 위치를 업데이트합니다.
  • 무작위 배치 집단 중심
  • 모든 데이터가 최근 중심 클러스터에 속해 있다고 가정
  • 중심 위치를 업데이트하기 위해 소속 데이터의 위치 정보를 사용합니다
  • 무게 중심에 변화가 없을 때까지 2부터 반복
  • 집합의 중심 위치를 계산하는 관계에서 집합은 초구면이라는 것이 기본적인 전제 조건이다.
    여기 있는 졸렬한 설명을 읽는 것보다 K-Manas 알고리즘을 시각적으로 설명하는 사이트 있어요. 아주 쉬워요. 꼭 참고하세요.

    혼합 가우스 모델(GMM) 알고리즘


    GMM은 데이터의 분포를 다변량 정적 분포의 중첩으로 표시하고 이 데이터가 속한 확률이 가장 높은 정적 분포를 이 데이터의 묶음의 기법으로 한다(솔직히 필자는 이 알고리즘을 잘 설명할 자신이 없다. 만약에 당신이 잘못된 길을 걷게 된다면 다행이다!)
    GMM에서도 클러스터 수(=정적 분포 수)를 미리 결정해야 합니다.

    DBSCAN


    DBSCAN에서 데이터 사이의 거리(유클리드 거리)가 지정된 값 이내이면 데이터를 한 집단의 알고리즘으로 집합한다.아직 클러스터에 속하지 않은 데이터 중 클러스터 소속 데이터와의 거리가 지정된 값 이내이면 해당 클러스터에 저장됩니다.
    집단의 데이터를 가져올 수 없으면 집단에 속하지 않은 데이터 사이의 거리를 계산하고 새로운 집단을 만들 수 있는지 확인합니다.
    DBSCAN에서는 K-Manas나 GMM과 달리 하나의 클러스터가 속한 데이터 사이의 거리를 미리 정의할 필요가 없다.

    Jubatus를 사용한 클러스터링


    그럼 저는 실제로 Jubatus를 사용하여 컬렉션을 실시하고 싶습니다.그리고원본 코드가github에 놓임.
    집계의 대상으로 참고scikit-learn의 집합 페이지로 2차원 수치 데이터(위치 좌표)를 가진 데이터를 준비했다.

    집합 결과(이상적인) 집합으로 파란색과 녹색으로 표시하기를 바랍니다.
    맨 오른쪽 blogbscircles와 noisymoons 덩어리의 형상이 복잡해서 대처하기 어려울 것 같습니다.

    K-Manas의 클러스터 결과


    먼저 K-Manas를 사용하여 클러스터링을 수행합니다.
    여기는embedded-jubatus를 사용하여 주batus 서버를 거치지 않고 직접 호출Jubatus 알고리즘 섹션합니다.
    먼저 Jubatus에 전달할 설정을 결정합니다.
    CONFIG = {
        'method': 'kmeans',
        'parameter': {
            'k' : 2,
            'seed' : 0,
        },
        'compressor_parameter': {
            'bucket_size': 2,
        },
        'compressor_method' : 'simple',
        'converter': {
            'num_filter_types': {},
            'num_filter_rules': [],
            'string_filter_types': {},
            'string_filter_rules': [],
            'num_types': {},
            'num_rules': [
                {'key': '*', 'type': 'num'}
            ],
            'string_types': {},
            'string_rules': [
                {'key': '*', 'type': 'space',
                 'sample_weight': 'bin', 'global_weight': 'bin'}
            ]
        },
    }
    
    'method' K-Manas 알고리즘을 지정합니다.'k'는 집계수의 지정이다.또 주바투스는 bucket_size에 지정된 값의 데이터를 추가로 집계할 예정이다.위 설정에서 데이터가 2개씩 추가될 때마다 클러스터링을 수행하는 셈이다.또 주바투스는 대량의 데이터를 효율적으로 처리하기 위해 일정한 데이터가 쌓이면 줄어드는 핵심 집합 기능을 설치했지만, 이를 간소화하기 위해 핵심 집합 기능을 사용하지 않기로 설정'compressor_method'했다.simple는 데이터의 변환 처리이다.가져온 데이터가 피쳐로 변환되는 방법을 지정합니다.자세한 내용은 공식 사이트를 참조하십시오.
    이곳의 특징은 'converter'에 입력한 수치 데이터(데이터의 2차원 좌표)이다.
    K-Manas가 모인 결과는 다음과 같습니다.

    응, 잘 모이지 못했어.K-Manas에서 초구면으로 분할된 클러스터를 위해 noisycircles와 noisy만약 moons 등 덩어리의 형상이 복잡하다면 잘 분류하기 어렵다.
    Blocbs와 같은 데이터 분포라면 K-Manas가 정확하게 분류될 것으로 기대되지만, 분포가 타원형일 수 있기 때문에 이번에는 잘 분류되지 않는다.

    GMM 클러스터 결과


    이제 GMM의 컬렉션을 시도해 봅시다.
    방금 K-Manas의 설정에서 다음을 변경합니다.
    CONFIG['method'] = 'gmm'
    
    GMM의 하이퍼매개변수는 K-Manas와 마찬가지로 변경'num_rules'만 하면 GMM을 실행할 수 있다.
    GMM의 집계 결과는 다음과 같다.

    다소 다르지만 결과는 K-Manas와 같습니다.
    GMM은 사용 분포를 통해 K-Manas보다 더 복잡한 형태의 클러스터라도 클러스터링할 수 있지만, 여기의 결과는 다소 예상 밖이다.앞으로 나는 원인을 분석하고 싶다.

    DBSCAN 기반 클러스터 결과


    마지막으로 DBSCAN의 컬렉션을 시도해 보고 싶습니다.
    DBSCAN은 K-Manas 및 GMM과 하이퍼매개변수가 다르므로 다음과 같이 설정합니다.
    CONFIG['method'] = 'dbscan'
    if 'k' in CONFIG['parameter']:
        del(CONFIG['parameter']['k'])
    if 'seed' in CONFIG['parameter']:
        del(CONFIG['parameter']['seed'])
    CONFIG['parameter']['eps'] = 0.3
    CONFIG['parameter']['min_core_point'] = 2
    
    'method', 삭제k, 추가seed, eps.min_core_point는 상술한 집단과 식별 데이터 간의 거리이다.또한eps min_core_point 내 거리 내의 데이터 수는 여기서 지정한 수치 이하의 경우 집단으로 사용하지 않는다.고립점이 독립된 집단으로 식별되는 것을 방지하는 데 쓰인다.
    상기 설정을 통해 분류를 실행한 결과는 다음과 같다.

    noisy_circles와 noisymoons에서는 거의 이상적인 집단을 추출할 수 있습니다.
    데이터 사이의 거리만 집단을 식별할 수 있기 때문에 집단의 형상이 복잡해도 대응할 수 있다.
    블로그의 오른쪽 상단에 붉은 점이 있다.이것은 세 번째 집단으로 식별된 데이터 그룹이다.

    총결산


    Jubatus의 여러 머신러닝 알고리즘을 사용해도 두드러지지 않은 존재하는 클러스터 기능을 사용하여 다양한 분포된 데이터로 클러스터를 추출하려고 시도합니다.
    이번 예에서 DBSCAN은 가장 이상적인 집단을 추출했다.
    다만, DBSCAN에도 약점이 있어 결정eps 값이 매우 어렵다.
    값이 너무 크면 모든 데이터가 한 집단에 집중되고 값이 너무 작으면 작은 집단이 많이 형성된다.
    이번 실험에서도 군집 결과를 보면서 eps의 값을 바꾸는 시행착오를 5, 6차례 실시했다.
    또 이번에는 2차원 평면상의 데이터이기 때문에 집계 결과를 가시화해 조정할 수 있다eps. 그러나 문장 데이터를 대상으로 하는 경우 데이터 사이즈에 따라 특징 공간이 수만 차원~수십만 차원으로 변하는 경우도 적지 않다.이러한 고차원 특징 공간에서 가시화 자체가 매우 어려우므로 다른 조정 방법을 고려할 필요가 있다.
    이처럼 주바투스의 클러스터 기능은 실제 데이터에서 클러스터링을 고려할 때 개선할 여지가 크다.
    저야말로 이런 사람입니다. 주바투스 군집 기능의 추가와 개선을 꼭 기대해 주십시오!
    다음 Jubatus Advent Calendar는 @shiodat에 대한 시각화입니다.잘 부탁드립니다!

    좋은 웹페이지 즐겨찾기