티스토리 뷰

이전 포스팅에서는 마할라노비스 거리가 무엇인지 알아보았다.

마할라노비스 거리를 모른다면 해당 링크를 참고하여 공부하고 오길 바란다.

https://angeloyeo.github.io/2022/09/28/Mahalanobis_distance.html

 

마할라노비스 거리 - 공돌이의 수학정리노트

 

angeloyeo.github.io

 

MCD모델에 들어가기 앞서, 기본적으로 몇가지 알고 넘어가야 할 것이 존재한다.

 

1) 공분산

2개의 확률변수의 상관'관계' 만을 나타내는 값 ( Positive- 양수, Negative- 음수, None- 0 인지 관계만 나타내줌. 강도 X)

관계만 알 수 있는 이유는... X와 Y 두 변수가 있을때, 어느 한쪽의 단위 (e.g.) 몸무게를 Kg 으로 표시하던 걸 g으로 표시하게 되면, 공분산의 값은 바뀌게 됨. 즉, 강도를 나타내는 지표는 아님. '관계'만 알 수 있음.

공분산 공식

 

그래서, '강도'도 보기위해 절대적 크기(단위)에 따른 영향을 제거하여 정규화 시킨 상관계수가 등장.

위처럼 상관계수 공식을 이용하여 상관계수를 구할 수 있다.

 

이 공분산을 알고 있어야, 우리의 데이터셋에서 feature를 고려하여 정규화 시킬 수 있는 것이다.

 

그럼 본격적으로 MCD모델에 대해 알아보도록 하자.

생각보다 너무나 간단하다. 살펴보도록 하자.

https://scikit-learn.org/stable/auto_examples/covariance/plot_mahalanobis_distances.html

 

Robust covariance estimation and Mahalanobis distances relevance

This example shows covariance estimation with Mahalanobis distances on Gaussian distributed data. For Gaussian distributed data, the distance of an observation x_i to the mode of the distribution c...

scikit-learn.org

해당 sklearn의 글을 참고하는 것도 좋은 방법이라 생각된다.

 

일단, 이전 포스팅에서 마할라노비스 거리만 사용하게 된다면, 이상치에 영향을 많이 받는다는 단점이 존재한다고 말했다.

이 단점을 극복하기 위해 나온 것이 MCD estimator.

 

MCD모델은 다변량 변수의 이상치에 매우 Robust하게 작동할 수 있는 추정기이다.

어떻게 Robust하게 작동하게 만들 수 있을까?

 

바로 MCD 이름에서도 알 수 있듯, '최소 공분산 행렬'을 만드는 데이터 셋을 찾는 것이다.

 

nCr 조합을 통하여 n개중 r개만큼 데이터만 이용한 공분산 행렬을 만들고, 그 중 log(행렬식)을 이용하여 가장 최소가 되는 데이터 셋을 구하게 된다.

 

그럼 r을 몇개로 정할 지는 어떻게 정할까? sklearn의 mcd 내부 코드를 보면 아래와 같다.

전체 데이터 중 몇 개를 r로 하겠다는 비율이 없으면 , 올림((전체 샘플 + 피쳐 수 + 1) * 0.5) 을 통하여 r을 지정한다.

 

그 이후 조금 더 세분화되어 최소공분산 행렬을 찾기위한 방법이 사용된다.

 

1. feature가 1개일경우

   a. n_support <  총 데이터 수일 경우

       a-1. 데이터 오름차순 정렬

       a-2.밑 식을 통해 diff 계산 ( 상위 - 하위 차이)

X_sorted[n_support:] - X_sorted[: (n_samples - n_support)]

       a-3. 차이가 가장 적은 index 선택

       a-4. 밑 식을 통해 location 거리 구하기 ( 중간 지점의 평균을 취하여 강력한 위치 추정치를 얻음)

(0.5 * (X_sorted[n_support + halves_start] + X_sorted[halves_start]).mean())​

       a-5. 구한 dist를 바탕으로 중심지점으로 데이터 이동

       a-6. 중심지점에서 멀지않은 n_support 갯수만큼 데이터 생성

       a-7. location(마할라노비스) , covariance, dist를 구함 <끝>

 

b. n_support >= 총 데이터 수일 경우

      b-1. feature가 하나기 때문에 모든 데이터를 사용하여 covariance( 입력 데이터의 분산) , location ( 입력 데이터의 평균)을 구하여 마할라노비스 거리를 구함. (끝)

 

=========================================================================================

 

2. 전체 샘플수 500개 초과 & feature 2개 이상

   a. 500개의 데이터 셋이 넘을경우, 최대 데이터 셋이 300개가 들어가는 subset을 만들기 위해 준비

   b. 나눠질 subset 갯수와 하나의 subset에 들어갈 데이터 갯수 정의

   c. 셔플하여 데이터셋 섞기

   d. Subset마다 할당된 데이터를 가지고 best location, variance를 하나로 모음

   e. 나눈 데이터셋을 merge,  min(1500, 총 샘플수)개만큼 랜덤으로 추출

   f.  n개 subset으로 생성해놓은 location, variance 모음으로 e.를 수행한 데이터셋을 사용해 가장 det가 작은 location,variance 을 k개 추출

   g. 총 데이터가 1500개 미만시  f.에서 구한 집합중 det가 가장 낮은 location,variance,dist return

   h. 총 데이터가 1500개 이상이면 f.에서 구한 location, variance를 가지고 전체 데이터셋을 이용하여 최소 det가 되는 location,variance,dist return

==========================================================================================

 

3. 전체 샘플수 500개 이하 & feature 2개 이상

<기본 과정>

    - default 30번, 랜덤으로 n개 데이터 중 r개만 선택 후 location(중심점),dist(마할라노비스거리), det( log(행렬식) )를 구함

    - dist가 짧은 순으로 정렬 후 상위 r개만 가지고 다시 location, dist, det( log(행렬식) )를 구함

    - 기존 det보다 작아지면 반복 수행, 작아지지 않거나 (or) 횟수 (defalut = 30)가 끝날때까지 진행함

위와같은 방식으로 default 30번 수행

 

30개 중 중 log(행렬식)이 가장 낮은 10개만 선택

    - 선택한 10개의 (location, covariance) 쌍을 가지고, 한 쌍씩 전체 데이터의 마할라노비스 거리를 구하여 각 데이터의 마할라노비스 거리가 가장 낮게 나오는 r개 데이터만 sample로 추출

    - 이후 선택된 r개의 샘플을 통해  <기본 과정>을 똑같이 수행하여 covariance(공분산)을 구고 log(행렬식)으로 가장 낮은 최종 결과 return

 (정리하자면, 처음에는 랜덤 sample을 통해 r개 선택하여 location, covariance를 구함: 1차 10개 필터링,

  두번째에는 필터링된 ( location, covariance)쌍을 가지고 랜덤 sample이 아닌, 전체 데이터에서 마할라노비스 거리가 가장 낮은 데이터 r개 sample하여 최종 location과 covariance를 만들어 내는것)

=========================================================================================

 

위와같은 방식으로 가장 '최소 공분산 행렬'을 만들 수 있는 sample을 찾아 해당 sample만 이용하여 location, covariance를 구축하고, location, covariance를 사용하여 마할라노비스 거리를 구하는 방법으로 강건한 모델을 생성할 수 있다.

 

 '최소 공분산 행렬'을 만들 수 있는 데이터(A라 칭함)만을 가지고 feature의 관계를 반영하여 데이터를 정규화 시키게 되면, A데이터셋 분포에서 멀리 떨어져 있는 데이터들은 큰 마할라노비스 거리의 값을 가지게 된다.

즉, 데이터 k의 마할라노비스 거리가 크면 클수록 데이터셋 분포와 유사한 것이 아닌, 벗어난 데이터가 된다는 의미로 '이상치'라고 판단할 수 있는 것이다.

 

한마디로 정리하자면... N개 데이터중 r개의 데이터만 사용하여 가장 작은 경계선을 만들 수 있는 그 경계선을 넘어가면 이상치!

(필자 개인적 생각임)

 

MCD하면 마할라노비스 거리밖에 생각 안났는데.. 이렇게 정리하고 보니.. MCD는 마할라노비스 거리가 중요한게 아니라, 강건한 모델을 만드는 방식이 더 중요하다는걸 알게됐다.. 마할라노비스는 단순 거리를 구하는 공식일뿐임!

MCD의 핵심 내용은 마할라노비스 X > '최소 공분산 행렬'을 만들 수 있는 데이터 셋을 찾는것이 중요함!!!!

 

 

 

* 참고

행렬식이 의미하는 것: 선형변환 될 때 단위 면적이 얼마만큼 늘어나는가? 

https://angeloyeo.github.io/2019/08/06/determinant.html

> 단위면적이 많이 늘어나지 않으면 그만큼 데이터가 모여있다고 볼 수 있다. ( 필자 개인적 생각 )

> 즉, 이상치를 고려하지 않은 범위를 생성할 수 있다.( 필자 개인적 생각 )

 

 

===========================내가 나중에 볼거...(간단 정리)=======================================

 

가우시안 정규 분포 = 정규 분포

 

MCD > 다변량 변수의 이상치( 위치, 분산 ) 에 매우 Robust 강인한 추정기다. ( Robust > 일반화를 잘 할 수 있다, 영향을 덜 받는다) 어떻게 Robust하게 만들었을까?

 

"최소 공분산 행렬을 만드는 데이터 셋을 찾는 것!"

( nCr 을 통해 r개만큼 데이터만 이용하여 log(행렬식)이 가장 최소로 나오는 데이터 셋을 찾는 것이다. )

 

그러나 정확한 MCD 계산은 전체 n개의 데이터 중 h개의 데이터 를 계속 뽑아서 계속 variance matrix를 구하고 determinant를 계산해야하기 때문에 nCh번의 계산작업을 요한다. 즉 computation이 매우 버겁다. 이를 완화하고자 FAST_MCD 방법이 탄생하였다. (사실 위에서 설명한 것이 FAST_MCD 방식)

 

중요 ) 공분산 행렬을  행렬식을 통해 나온 값에 log 을 취하여 값을 구한다. ( log(행렬식) )

이 구한 log행렬식의 값중 최소 값이 되는 데이터 셋으로 만든, 거리(각 피쳐별 평균값),  공분산 행렬을 가지고 이상치 탐지를 한다.

log(ad - bc)를 통해 (2차원 일때)

 

location은 각 feature의 평균을 뜻한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함