머신러닝은 지속적으로 발전하고 있습니다. 정확도는 올라가고 있고, 우리 삶에서 많은 부분(구글포토 등)에 영향을 주고 있습니다.
그러나 클러스터링의 경우, 현실세계에서 클러스터링을 수행하고 평가하는 것은 생각보다 어려운 일입니다. 왜냐하면 클러스터링을 할 자료에는 답안지가 없기 때문이죠.
그리고 자료의 차원이 낮다면 자동차 세그먼트처럼 구분할 수 있겠지만, 현실세계에서는 자료의 차원은 높고, 나의 인지범위는 2차원을 못 넘을 뿐이죠. 🤢
여기서 보스턴 주택가격 자료를 가지고 아주 간단한 클러스터링을 진행해보겠습니다.
이 자료는 클러스터링이 아닌 회귀예측을 위한 자료이며, 506개의 레코드와 13개의 변수로 구성되어 있습니다.
이게 뭐지???
1) 데이터 스케일링
- 각 변수마다 자료의 척도가 다르기 때문에, 원자료는 그대로 사용시 클러스터링시 문제가 발생할 수 있습니다.
- 원칙적으로 자료는 탐색한 후, 자료에 맞는 스케일링을 실시해야 하지만 !귀찮아서! 스탠더드 스케일링을 진행하겠습니다. (평균 0 / 표준편차 1)
외계어 아닙니다
2) 클러스터 수에 따른 평가
- 클러스터링은 비지도학습으로 평가측정이 어렵습니다.
- 일반적으로 Silhouette(높은수록 좋음 / 0.5 이상 ok), Davies-Bouldin(낮을수록 좋음 / 최소값 0) 점수를 활용하지만,
클러스터가 모여있다는 가정하에서 클러스터의 모양을 판단하기 때문에, 실제 클러스터링 목적과 부합하지 않을 수 있습니다. - 여기에서는 계층군집화(개별사례 간 유사도를 측정하여 클러스터링)을 2~10개의 클러스터로 설정하여 지표를 확인하였습니다.
클러스별 평가점수 / 현실세계자료라서 애매함
지표를 표로도 봅시다
3) 차원축소 Manifold(T-SNE)로 2차원으로 클러스터링을 비교
- 원칙적으로 클러스터링별 자료를 해석하는 것이 원칙이나 (귀찮아서)여기서는 생략합니다.
- 반드시 명심할 것은 차원축소로 클러스터링을 비교하는 것은 위험성이 높습니다.
(차원축소의 경우, 다차원의 자료에 기반하기 때문에 축소시 자료해석에 손실이 발생할 가능성이 높음) - 현실세계의 자료는 클러스터별 원자료를 해석하는 경우 클러스터링이 잘된 것으로 판단될 수 있으나, 차원축소된 그래프로는 명확히 나눠지지 않는 난감한 경우도 많이 발생합니다. (그렇다고 가짜 그래프는 삼가합니다)
- 앞선 지표에 의해서 클러스터 개수를 정하더라도, 실제 클러스터링을 판단/결정하는 것은 분석가의 주관적 판단이 필요한 것을 명심해야 합니다.
클러스터 별 결과인데... 몇개로 클러스터를 설정하는 것은 여러분의 선택입니다.
현실문제에서 클러스터링은 훨씬 많은 시간 및 계산비용이 소모됩니다.
사실 계층적 군집분류의 경우 레코드가 100만 건이 넘어가면, 간편한 Sci-Kit Learn을 사용하면 일반적인 개인컴퓨터에서는 메모리 문제로 실행되지 않습니다. Spark 같은 대량 병렬처리 방법으로 접근해야 하기 때문에... (살려줘)

자세한 내용은 출처의 링크를 확인하셔도 좋습니다. 출처에 있는 자료를 내려받은 후 실행해보시면 더 이해가 빠르실겁니다.
예를들면 1 2 3 56 58 62 1003 1020이 있으면
위 방법을 적용하면
1 2 3
56 58 62
1003 1020
으로 분류가 될수 있을까요?
1차원 수치 데이터의 경우, K-Means를 사용하면 큰 덩어리 간의 중간점이 클러스터의 경계선이 됩니다.
예를 들어 (3 / 56) (62 / 1003) 의 평균이 3개로 나뉘는 클러스터링이 될 것입니다.
하고 들어왔다가
절레절레 하고 갑니다
학부때 배웠던 군집분석 내용인것 같습니다 ㅎ
자료의 형태 및 의미에 따라서 클러스터링의 기법을 다르게 적용하는 것이 일반적입니다.
K-Means의 경우, 각 케이스의 Feature를 일종의 초평면에 펼쳐놓은 상태에서 중심점을 랜덤하게 설정 후, 분산이 최소화되는 클러스터 수를 찾고나서, 원형의 형태로 클러스터링을 수행하게 되죠.
Hierarchical 클러스터링의 경우(케이스간 거리를 각 계산해야 되기 때문에, 계산비용이 비싼 클러스터링입니다.)
1) Euclidean 거리를 사용하면 개별 케이스간 직선거리를 계산하면서, 비슷한 케이스를 묶어 나가게 됩니다.
2) 만약 Cosine 거리를 사용한다면, 개별 케이스의 벡터의 방향(즉 케이스간 벡터각도 / 고소 각도기 아닙니다...)이 0도에 가까우면 비슷한 케이스로 묶어 나가게됩니다. (추천시스템에서 많이 이용하죠)
위의 코드는 Hierarchical 클러스터링에서 Euclidean 거리를 이용한 것 입니다. 실제 데이터를 탐색한 후, 알맞는 클러스터링 기법을 찾는 것이 !영업비밀입니다!
사실 기존 클러스터링 방법도 모두 머신러닝의 한 가지입니다.
주성분분석 아쩌구 어쩌구... 피트장에게 쉽게 설명하기가 너무나 어렵습니다 ㅠㅠ
사실 그 부분은 포기하시는 것이 빠릅니다. 심지어 제가 다니는 데이터 분석회사에서도 비슷한 일이 일어나고 있습니다.😥
클러스터링 과정 및 결과 해석문제로, 실제 비지니스에서는 클러스터링 대신 세그먼트를 여전히 사용하는 이유이기도 합니다.
데이터 별로 각각 다른 변환을 하고 힌번에
클러스터링을 하는게
일반적인 방법인가요??
맞다면, data구조를 먼저 파악하고 변환하는 비용이 너무 들어가는데,,, 일률적으로 적용 할수 있는 방법이 있을까요? 저는 tukey 변환 사용하고 있습니디민, 더 좋은게 있을지요?
클러스터링을 진행할때 문제되는 것이 크게 2개가 있습니다. 1) 답안지가 없음 2) 그럼 어떤 Feature를 써야됨?
1번은 어차피 답안이 없다는 것은 당연한 일이기 때문에 2번이 문제가 되는데요. 고객을 클러스터링한다고 생각해본다면, 고객의 구매성향(몇번 샀는가?/ 고른 빈도로 사고 있는가?/ 매출액은? / 등...) + 고객정보(성별/사는곳/ 등)이 있을 겁니다. 실무자와 면담을 통해서 필요하다고 판단되는 정보(Feature)를 추려냅니다.
그래서 각 Feature별 스케일링을 할때 일률적으로 변환하기 어려운 점이 많습니다. 어떤 정보들은 척도간 연관이 있어서 상대적인 거리를 유지하면서 스케일링이 되어야 하고, 어떤 정보들은 척도간 연관성이 없기 때문에 상대적인 거리유지가 필요없기도 하죠.
그나마 한번에 한다면, scipy.stats.boxcox에서 log-likelihood를 극대화하는 방향으로 lambda를 자동으로 찾아주게 할 수는 있을 것으로 생각됩니다.
저도 아직 배움이 워낙 부족해서 모든 문제에 답을 해드리기 어려울 수 있지만, 질문 주시면 최대한 답변을 드리도록 하겠습니다.
현재자료가 시계열 자료라고 가정하고, 최종목적이 이상감지라고 한다고 생각해보죠.
아주 간단하게 접근한다면
1) 시계열자료를 시간차(t - 1 / t-0)로 차분한 자료를 생성
2) 이상감지기간(t + alpha)에 이상감지 Label(0/1) 생성
3) Window사이즈(학습시 사용할 과거자료 기간) 설정
4) Data(t - window ~ t-0) / Label(t+alpha) 데이터셋을 만들고
5) CNN + LSTM을 결합한 모형으로 학습 (CNN으로 일종의 데이터 노이즈를 감소시키고, LSTM으로 시간순서를 감안하여 이상감지)
6) 이제 코드작성을...
이정도로 진행하면 괜찮을지 모르겠네요.