커뮤니티 대회

월간 데이콘 신용카드 사기 거래 탐지 AI 경진대회

[Pytorch] 매우 간단한 1D AutoEncoder 활용 (Public Score : 0.926)

2022.07.13 11:48 5,710 조회 language

안녕하세요.
Unsupervised Anomaly Detection에 대해 대회 형태로 직접 참여해볼 수 있는 기회가 있어서 재밌게 하고 있습니다.
간단하게 나름의 1D AutoEncoder를 만들어서 학습을 시켜보았습니다.
알고리즘은 간단하게 30차원의 벡터를 Input으로 하고, AutoEncoder로부터 복구된 30차원의 벡터를 Output으로 하여
 Input과 Output 벡터들의 Cosine유사도에 Threshold를 주어 정상/사기로 구별하였습니다.

1. 추가로 AutoEncoder의 Encoder는 차원이 축소되고 Decoder는 다시 원래 차원으로 늘려주는 형태일텐데, 이 데이터셋은 차원이 30으로 매우 작아서 Encoder에서 차원을 늘려주고 Decoder에서 다시 줄이는 형식으로 아주 간단하게 구현했습니다. 덧붙이자면 Layer를 많이 쌓아 Encoder에서 차원을 축소하고 Decoder에서 복원하는 형태도 좋을 것 같네요

2. 정상 / 사기를 판단하는 기준과 Threshold는 다양하게 적용해볼만한것같습니다. 저의 경우에는 판단 기준을 두 벡터의 Cosine유사도를 사용했지만 더 좋은 다른 방법도 충분히 있을 것 같습니다.

3. 이미 많은 분들도 아시겠지만, Validation 데이터셋을 통해서 평가를 해보면 정상 샘플에 대한 성능은 충분히 잘나오는 편입니다. 불량(사기)를 잘 잡아내는 것이 이번 대회 점수 경쟁에 큰 핵심일 것 같고 때문에 Public 점수에서는 동점이 많이 존재하는 것 같습니다. 하지만 Private은 Public보다 훨씬 큰 데이터셋이기 때문에 Shake up에 유의해야 할 것 같습니다.

4.  3번의 내용에 이어서, 제 학습 로그를 보면 Validation 평가 성능도 일정 수준에서 멈춰버리는 것을 볼 수 있습니다. 이는 매우 분류하기 어려운 사기 샘플이 존재하는 것 같고 Test 데이터도 다르지는 않을 것 같습니다. 정상에 가까운 사기 거래를 잘 잡아내야할 것 같습니다..

코드
로그인이 필요합니다
0 / 1000
땅땅이
2022.07.13 20:19

맞아요 사기거래 잡아내는게 이 대회에 관건인것에 동의합니다 코드공유 감사합니다!!

나는슬플때파이썬을해
2022.07.13 21:46

호오.. 흥미롭네여 코드 공유 감사합니다!

JHPark
2022.07.14 15:36

코드 굉장히 깔끔하네요, 많이 배워갑니다. :)

LIONKINGyh
2022.07.14 17:00

삭제된 댓글입니다

LIONKINGyh
2022.07.14 17:04

batch size 를 크게 잡은 이유가 있을 까요 ?

NN_is_all_you_need
2022.07.14 18:23

이 대회는 학습 데이터셋에 Label이 주어지지않고, 더해서 정상/사기가 모두 존재하는 조건이기 때문에 
Batch에 포함된 불량 데이터가 AutoEncoder 학습에 많은 영향을 주지 못하도록 Batch 사이즈를 많이 늘려봤습니다.

LIONKINGyh
2022.07.18 11:35

아하 답변 감사드립니다 ㅎㅎ

JSP_98
2022.07.15 15:27

좋은 코드 감사합니다.

무지개사탕
2022.07.15 23:41

감사합니다.

eXpert_wish
2022.07.16 02:02

삭제된 댓글입니다

Simka
2022.07.18 00:01

감사합니다.

honghansol
2022.07.21 10:53

감사합니다

eterson
2022.07.24 22:55

공유 감사합니다

미로
2022.09.26 18:04

삭제된 댓글입니다

NN_is_all_you_need
2022.08.01 00:15

해당 본문에 관련해서 이미 "1. 추가로 AutoEncoder의 Encoder는 차원이 축소되고 Decoder는 다시 원래 차원으로 늘려주는 형태일텐데, 이 데이터셋은 차원이 30으로 매우 작아서 Encoder에서 차원을 늘려주고 Decoder에서 다시 줄이는 형식으로 아주 간단하게 구현했습니다. 덧붙이자면 Layer를 많이 쌓아 Encoder에서 차원을 축소하고 Decoder에서 복원하는 형태도 좋을 것 같네요" 라고 적어놨습니다.