본문 바로가기
머신러닝/아웃라이어, 결측치

fraud detection 을 통해보는 outlier algorithm

by 혜 림 2021. 4. 14.

github.com/kkimlim2/outlier_detection

코드 확인은 위에서 

이제 git을 공부해서 어느 정도 할 줄 안다!! 위에 끊임없이 push할 예정이다

 

 

 

0. 배경

 이상치는 정상 데이터 분포에서 크게 벗어나는 데이터를 의미한다. 이상치는 정상 데이터의 분포를 왜곡한다는 점에서 데이터 정제 과정에서 필수적이다. 데이터 정제에서 나아가 다양한 목적에서도 이용되는 분야이다. 그 중에서도 본고는 특히, 금융 데이터에 접목하여 이상치 탐지 알고리즘들의 비교분석하며 보다 나은 방법을 제시하고자 한다. 

 

 

1. 데이터 셋

 본고에서 참조한 데이터 셋은 ieee에서 제공하는 셋으로, 금융 사기를 예측하는 것이 목적이다. transaction과 id 크게 두개의 셋이 있지만, 본고의 목적은 정확하게 fraud를 잡아내는 것이 아니라 이상치 탐지 알고리즘을 비교분석하는 것이 목적이기에 transaction  데이터 셋(이하, 데이터 셋)만 이용하였다. (590540,394) 사이즈의 데이터 셋이다. 


 2. 데이터 전처리 

 2 -0. 결측치

 

 본 데이터 셋에서는 50%이상 빈 셀이 있는 변수가 180개 가량 존재한다. 또한 동일한 ID에서 빈 셀이 다수 존재하기에 모든 변수를 안고 가는 것은 무리가 있어보인다. 결측치를 채움으로써 발생하는 문제나, 차원의 저주를 고려하여 해당 변수들은 모두 버렸다. 

 

2 -1. 명목형 변수

 

 변수가 300개 가량이 넘어가는만큼, 다양한 종류의 변수가 존재한다. 그러나 대부분의 알고리즘에서 숫자형 변수만을 취급하기 때문에, 명목형 변수들은 모두 인코딩할 필요가 있다. 'M'으로 시작하는 변수들은 모두 T 혹은 F값을 가지므로, 더미 변수 하나만을 이용하여 원핫 인코딩을 실시하였다. 

 이처럼 이진 클래스가 아니라 다수의 클래스가 존재하는 명목형 변수의 경우, class를 다시 분류하였다. 각각 class의 fraud를 비교한 후, 가장 높은 것과, 그렇지 않은 것들로 이진 클래스로 배정하였다. 

 

2 -2. PCA

 

 그럼에도 불구하고 여전히 차원의 저주를 피할 수 없을만큼 변수의 수가 많다. 따라서 PCA를 통해서 변수의 흩어진 정도는 일정 수준 유지하나, 변수의 수를 줄였다. 차원 축소를 통해서 취한 변수의 수는 5개인데, 이는 여러번의 시행을 통해서 가장 적합하다고 판단되는 수이다. 

 사실상 lof 나 마할라노비스의 거리, hdbscan 모두 runtime을 줄일 수 있었던 건 이 PCA를 통한 차원 축소 덕분이었다. 어쩌면 집 가기 전에 결과를 못 보고 갔었을 수도 있었으니까. 


 3. 알고리즘

 

  각각의 알고리즘에 대해서 간략하게 설명한다. 

  자세한 이해를 위해서는 아래의 자료들을 참고하기 바란다. 

github.com/pilsung-kang/Business-Analytics-IME654-/tree/master/03%20Anomaly%20Detection

 

 간단한 장단점 비교를 위해서는 본 블로그의 다른 포스팅을 참고하기 바란다. 

hyelimkungkung.tistory.com/9

 

3 0. 알고리즘 설명 

 

 3 - 0 -1. Isolation Forest

  

 모든 데이터를 이진 분류한다고 했을때, 이상치 데이터는 빠르게 분리, 즉 고립될 것이다.

 따라서 모든 데이터들이 분류되기까지의 횟수를 카운트한다(정확하게 말하면 뿌리 노드로부터의 거리를 계산하는 것이다).

  

19. Chen W. R., Yun Y. H., Wen M., Lu H. M., Zhang Z. M., Liang Y. Z.. Representative subset selection and outlier detection via isolation forest. Anal. Methods 8(39):7225–7231. 2016;

 

 

 3 - 0 -2. Local Outlier Factor

 

 데이터 포인터의 밀도를 고려하여 이상치를 탐색한다. 

 예컨대 밀도가 다른 클러스터가 여럿 있는 데이터 셋이라면, 유동적으로 밀도를 고려해야 할 것이다. 

 

 

3 - 0 -3. HDBSCAN

 

 밀도를 기반으로 클러스터링을 한다. 다만 DBSCAN과 HDBSCAN의 다른 점은 하이퍼 파라미터의 수에 차이가 있다. HDBSCAN은 DBSCAN의 입실론과 k값에 영향을 크게 받는다는 한계점을 극복하기 위해 고안된 알고리즘으로, 계층적 군집화의 개념도 함께 적용했다는 점에서 주목할만하다. 따라서 하이퍼파라미터의 수를 입실론 하나로 줄였다. 

 

 

3 - 0 -4. Mahalanobis

 

 기존의 유클리디안 방식으로 거리를 재는 것 대신, 새로운 거리 행렬을 고안했다. 공분산 행렬을 고려하여 데이터들의 센터 포인트로부터의 거리를 재고 이를 이용하여 거리가 먼 것을 결측치로 판단한다. 

 


3 -1. 알고리즘 비교 : 혼동행렬 

 

*아래의 표에서 재현율을 정밀도로, 정밀도를 재현율로 수정합니다.

 

 정확도, 재현율, 정밀도, F1 score을 통해서 비교한 바는 위와 같다. 마할라노비스는 정확도가 굉장히 높은 반면, 정밀도는 낮다. 이는 전체 fraud 중에서 fraud를 감지하는 성능이 안 좋은 대신, 정상인 데이터를 정상으로 감지하는 성능이 뛰어나기 때문이다. 즉 보수적인 알고리즘이라고 할 수 있겠다. 반면, iforest 같은 경우는 정상인 데이터를 정상으로 감지하는 성능은 조금 떨어지더라도 비교적 많은 fraud를 성공적으로 감지해낸다. 물론 lof도 마찬가지이다. 

 전반적으로 봤을 때 iforest가 fraud를 감지하는 것과 마할라노비스가 정상 데이터를 감지하는 것을 잘 혼용해서 사용할 수 있다면 보다 정확도를 높일 수 있을 것으로 보인다. 


3 -2. 알고리즘 비교 : 그래프   

 

 알고리즘을 통해서 계산한 이상치 점수 값의 범위도 다르고 (iforest의 경우 -0에서 -1사이인 반면, 마할라노비스의 경우는 값의 제한도 없고) 의미도 다르다(iforest의 경우 낮을수록 이상치인 것인반면, 마할라노비스의 경우 높을수록 이상치이다). 따라서 모두 일괄적으로 스케일링을 거쳤으며,  적절히 값을 변환하여 모두 0에서 -1 사이의 값을 가지고, 점수가 낮을수록 이상치일 가능성이 높음을 의미하도록 하였다. 

 

  그럼에도 불구하고 여전히 문제가 있는데, 일부 알고리즘의 이상치 점수는 특정 포인트가 굉장히 높은 바람에 스케일링을 해서 값의 범위를 비효율적으로 쓰는 경우가 있었다. 따라서 이를 시각적으로 보기 위하여 그 분포를 시각화한 그래프가 아래에 있다.  hdbscan 같은 경우 넓은 범위에 거쳐서 분포하고 있다. 1에 가까운 것이 많고, 아래로 갈수록 낮은 것이 바람직한 분포이나 lof는 지나치게 쏠려있어서 정확한 비교가 어렵다. 

 

대신, 다른 방식을 이용하고자 하였다. 

 

 아래 그래프는 다음과 같은 과정으로 플롯했다. 

 

   - 1. iforest outlier score를 기반으로 플롯을 그리고

   - 2. 그 위에 각각의 방법에서 정답이었던 fraud를 파란색으로 찍고( 점의 좌표는 (맞춘 점의 index, 맞춘 점의 iforest score) 

   - 3. 그 위에 각각의 방법에서 찾지 못했던 fraud를 주황색/빨간색으로 찍었다. 

iforest는 어떤 역치를 기반으로 자르기 때문에 역치보다 낮은 수준의 score를 가지는 fraud는 detect하지 못한다. 그러나 lof와 hdbscan은 iforest의 역치와는 상관이 없어 보인다. 따라서 iforest가 탐지하지 못한 점들을 찾아낼 수 있는 방식은 lof와 hdbscan일 것이다. 한편 마할라노비스의 경우는 일정 수준 겹쳐 보인다. 

 


 

 아래 그래프는 다음과 같은 과정으로 플롯했다.

 

   - 1. lof outlier score를 기반으로 플롯을 그리고

   - 2. 그 위에 각각의 방법에서 정답이었던 fraud를 파란색으로 찍고( 점의 좌표는 (맞춘 점의 index, 맞춘 점의 lof score) 

   - 3. 그 위에 각각의 방법에서 찾지 못했던 fraud를 주황색/빨간색으로 찍었다. 

 

그러나 lof 스코어의 경우 대부분 낮은 터라 제대로 비교하기 어렵다는 한계가 있다. 또한 눈에 보이는 일부 점수가 높은 점들은 실제로 fraud 가 아닌  포인트로, 성능을 높이기 위해서는 다른 조치가 필요할 것이다. 


 아래 그래프는 다음과 같은 과정으로 플롯했다.

 

   - 1. hdbscan outlier score를 기반으로 플롯을 그리고

   - 2. 그 위에 각각의 방법에서 정답이었던 fraud를 파란색으로 찍고( 점의 좌표는 (맞춘 점의 index, 맞춘 점의  hdbscan score) 

   - 3. 그 위에 각각의 방법에서 찾지 못했던 fraud를 주황색/빨간색으로 찍었다. 

 

hdbscan도 일정한 역치를 기준으로 이상치를 탐지한다. 따라서 세 번째의 그림에서 분명하게 나뉘는 것을 확인할 수 있다. 

 


 아래 그래프는 다음과 같은 과정으로 플롯했다.

 

   - 1. 마할라노비스 outlier score를 기반으로 플롯을 그리고

   - 2. 그 위에 각각의 방법에서 정답이었던 fraud를 파란색으로 찍고( 점의 좌표는 (맞춘 점의 index, 맞춘 점의  마할라노비스 score) 

   - 3. 그 위에 각각의 방법에서 찾지 못했던 fraud를 주황색/빨간색으로 찍었다. 


3 -3. 알고리즘 앙상블

 

 3 -3 -0. 단순한 합집합

 

3 -3 -1. 위의 그래프를 근거로 한 특수한 합집합

 

 위의 그래프를 통해서 알 수 있는 사실을 간략히 정리하면 다음과 같다

   - 마할라노비스의 거리와 isolatino forest 는 이상치 탐지의 결과가 비슷하다. 마할라노비스의 경우 엄격한 contamination rate를 가지고 있다고 생각하면 될 듯하다.

   - 한편 hdbscan은 lof 과 어느정도 유사한 결과를 나타낸다.

  - 따라서 isolatino forest가 탐지하지 못하는 것은 hdbscan과 lof에서 나타나는 반면, 그 둘에서 탐지하지 못하는 것은 isoaltion forest에서 나타난다.

 

=> 따라서 isolatino 과 마할라노비스의 거리를 한 집단, hdbscan과 lof를 하나의 집단으로 구분한 뒤, 두 그룹을 잘 섞으면 좋은 결과를 기대해볼 수 있을 것이다. 

 

 아래의 표는 isolatino forest가 이상치라고 탐지한 것과,

 lof와 hdbscan이 공통으로 이상치라고 탐지한 것 중, isolatino forest는 정상치라고 탐지한 것의

교집합으로 이루어진 부분이다. 

 

 

 정확도는 isolation forest나 마할라노비스에 비해서 상당 수준 떨어졌다. 87.45%이다. 그러나 재현율은 22.22%로, 크게 향상되었다. 반면 정밀도는 7.3%로 크게 떨어지지 않았다. 이를 기반으로 한 F1 score는 10.99이다. 재현율을 제외하고는, 여전히 isolation forest에 비해서는 크게 성능이 개선된 것 같지 않다. 

 

3 -3 -1. 위의 그래프를 근거로 한 특수한 합집합2

 

 iforest에서 탐지하지 못하는 이상치들을 lof와 hdbscan이 탐지할 수는 있지만 그 정확도가 낮다. 따라서 이를 고려한 투표를 진행했다. 

결과는 다음과 같다. 

 마찬가지로 정확도는 약 88%이지만, 재현율이 23.4%이고 정밀도는 8.18%다. 전체 F1 점수의 경우도 마찬가지로 12.12로 올랐다. 정확도를 제외한 대부분의 경우에는 점수가 증가한 것으로 볼 수 있다.

 

 

 


4. 결론

 이상치 검출을 보수적으로 할 것인지, 혹은 일단 뭉텅이를 잡아서 채로 거르는 식으로 할지, 그 방향성을 정한 후에 위의 기법들 중 적합한 것을 고르는 것이 도움이 될 것이다. 정확도를 우선시로 한다면 iforest를 단편적으로 쓰는 것이 가장 합리적으로 보인다. 그러나 만약 검출되는 아웃라이어의 수를 늘리고 싶다면, 3-3-1에서 제시된 특수한 합집합의 형태로 아웃라이어를 묶어내는 것이 바람직해보인다.

 한편, outlier를 classification의 문제로 볼 수도 있다. 여러 기법들의 outlier score를 기반으로 하여 두 개의 집단으로 클러스터링 한 후에 class를 부여하는 것이다. 이와 같이, 다시 한번 비지도 학습을 거침으로써 아웃라이어를 선별하는 새로운 모델을 만들 수도 있을 것이다. 


5. 부록(사족)

더보기

(본문보다 더 긴 부록)

 

 

 공부는 했지만 안타깝게 적용하지 못한 알고리즘들.. 명복을 빌어주며

 

   - SOM : 정말.. 다시 공부하는 재미가 생기게 해준 친구지만.. 딥러닝도 모를 때 공부한 딥러닝 알고리즘이라 아직 많이 모자란다

 

   - Extended Isolation forest :  해보면 정말정말 좋을 것 같은 알고리즘이지만, 아직 공식 문서가 없어서 그 신뢰성이 걱정돼서 해보지는 않았다 직접 구현해보는 건 없지 않아 생각해보았지만.. 중요한 문제는 그 아이디어는 알겠지만, 어떻게 구현되는지를 모르겠다. 예컨대 어떻게 해야 비수평적으로 차원을 자를 수 있을지? 이진 분류 트리로 크다 작다 이런식으로 나누는 게 수평저이라면 비수평적은 어떻게 나누는 걸까? 하여튼 그 방법을 구체적으로 이해를 못해서 아직 한계가 많다

 

   - 가우시안 혼합 모델 : 몇 개의 모델을 혼합할 것인지를 일괄적으로 디폴트 값을 설정하는 것은 결과값을 꽤 왜곡할 것 같았고, 그렇다고 사용자에게서 전달받기에는 개발의 영역이기에 잘 모르겠어서 넘겼다 

 

소감?

 

왜 이렇게 우리나라 자료는 없을까?

영어로 읽으니까 용어가 너무 헷갈렸다

피쳐? 그건 뭐야 변수랑 다른건가? 실상 변수란 말은 잘 안 쓰는 것도 좀 신기하고 별로였다 

 

또 강필성 교수님 깃허브는 너무 알차서 좋다 교수님 수업 들어보고 싶다 

진짜 산경공 가야하나..ㅠㅠ 

 

그리고 대부분의 논문에서 코드는 비밀인 게 신기했다 

이런 알고리즘만 소개해주고 구현은 읽는 사람의 몫이라니 허허

그래서 조그마하게 알고리즘을 구현하는 것부터 공부해볼까 한다 와우 공부할 건 언제나 많다

 

실은  기존의 라이브러리 소스코드는 한 번도 열어본 적이 없었고 공식 문서도 본 적이 없었다

그런데 이번 기회를 통해서 sklearn의 소스코드나 pandas 소스코드나.. 이것저것 열어보면서 또 성장했다고 느꼈다 초큼ㅎㅎ

그치만 소스코드를 봐도 모르겠다! 내 생각엔 모든 포인트 들을 돌려면 반복문이 있어야 할 것 같은데 그것도 아니고..?

 

그리고 또 이번엔 github 사용하는 방법도 공부했다

생각보다 마않이 어려웠다 이럴 줄 알았으면 그때 걔가 알려줄때 귀담아 들을껄 아효

그래도 이제 얼추 하는 흉내는 낼 수 있어서 다행이다

 

 파라미터 튜닝은 하나도 하지 않았다. 무조건 디폴트 값이 사용될 것이기 때문에 함부로 파라미터를 튜닝하기 두렵다. 너무 과적합된 알고리즘이 만들어질 우려가 반영된 것이다. 

 

 

 

댓글