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

알고리즘 | 정형 | 분류 | 탐지 | Macro f1 score

  • moneyIcon 상금 : 100만 원 + ɑ
  • 2,126명 마감

 

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

2022.07.13 11:48 11,543 조회 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에서 복원하는 형태도 좋을 것 같네요" 라고 적어놨습니다.

KWJ
2023.08.25 10:27

안녕하세요. 좋은 코드 공유 감사합니다. 
혹시 trainer = Trainer(model, optimizer, train_loader, val_loader, scheduler, device)까지는 잘 작동하고 모델도 할당되는데
trainer.fit()에서 아무 응답 없이 계속 돌아가기만 하는 이유를 알 수 있을까요? input size를 잘못 넣었는데도 오류 같은 output이 일절 없이 계속 돌아가기만 합니다. 
gpu도 올바르게 할당해서  torch.cuda.is_available()도 True로 나오는데 이유를 모르겠어서 여쭈어봅니다.

참고로 해당 데이터셋이 아닌 다른 데이터셋에 적용 중이고 중간에 df['class'] 부분도 제 데이터셋에 맞게 수정했습니다.

NN_is_all_you_need
2023.08.25 11:11

오류가 안나고 돌아간다는거면 학습이 되고 있는거 아닐까요?
input size를 잘못넣었다는게 무슨 상황인지 모르겠습니다.

KWJ
2023.08.25 11:56

input size를 잘못 넣었다는 말은 제 데이터셋 변수는 44개인데 일부러 30개로 넣어서 오류가 나게끔 했다는 것입니다. 만약 정상적으로 돌아가고 있다면 첫 iteration부터 오류가 나야 정상인데 24시간이 지나도 셀은 실행 중이고 아무런 output을 출력하고 있지 않아서 뭔가 잘못되었다고 느끼는 중입니다.

NN_is_all_you_need
2023.08.25 12:45

Data Loader에서 제대로 반환하고 있는지, iter 하나하나 체크해보세요. 디버깅을 하시는수밖에 없습니다. 제가 답변드리기에는 너무 한정적인 정보입니다.

KWJ
2023.08.25 13:17

넵 알겠습니다. 답변해주셔서 감사합니다!