← 개발 로그 목록

CUDA-study: 신용카드 사기 탐지 모델 성능 개선 및 문서화

/ 6분 분량 / 개발 로그

이번 커밋은 신용카드 사기 탐지 프로젝트에서 kNN 그래프 구성 시 이웃 수를 조정하는 실험 결과를 기록하고, 프로젝트의 한국어 README 문서를 추가하는 내용을 담고 있습니다.

CUDA-study: 신용카드 사기 탐지 모델 성능 개선 및 문서화

이번 커밋은 신용카드 사기 탐지 프로젝트에서 kNN 그래프 구성 시 이웃 수를 조정하는 실험 결과를 기록하고, 프로젝트의 한국어 README 문서를 추가하는 내용을 담고 있습니다.

요약

이번 커밋은 fraud-detection 디렉토리 내에서 kNN 그래프 구축 시 이웃 수를 다양하게 설정하여 Louvain 커뮤니티 탐지 알고리즘의 성능을 평가하는 스크립트(knn_k_sweep.py)를 추가하고, 해당 실험 결과를 results/k_sweep.csv 파일로 저장하도록 구현했습니다. 또한, 프로젝트의 이해를 돕기 위해 한국어 README 파일(README.ko.md)을 새로 추가했습니다.

배경 및 목적

기존 사기 탐지 모델은 kNN 그래프를 기반으로 Louvain 커뮤니티 탐지를 적용하여 사기 거래 그룹을 식별하는 방식을 사용했습니다. 하지만 kNN 그래프를 구성할 때 몇 개의 최근접 이웃을 사용할지에 대한 최적의 값을 찾지 못했습니다. 따라서 이웃 수(k)를 변경해가며 실험하여 어떤 k 값이 사기 커뮤니티를 더 잘 식별하는지, 혹은 더 정확한 결과를 내는지 확인하고자 했습니다. 또한, 한국어 사용자를 위해 프로젝트 설명을 한국어로 제공할 필요가 있었습니다.

구현 내용

이번 작업으로 총 167 라인의 코드가 추가되었습니다.

주요 변경사항 상세 설명

  • fraud-detection/knn_k_sweep.py: kNN 그래프 구축 시 k 값을 5부터 50까지 변화시키며 Louvain 커뮤니티 탐지를 수행하는 파이썬 스크립트를 작성했습니다. 각 k 값에 대해 그래프의 엣지 수, 커뮤니티 수, 사기 거래를 포함하는 상위 2개 커뮤니티의 크기 및 사기 거래 수, 그리고 해당 커뮤니티들의 정밀도와 재현율을 계산합니다. 계산 시간과 함께 이 결과들을 results/k_sweep.csv 파일에 저장합니다.
  • fraud-detection/README.ko.md: 프로젝트의 목적, 사용된 기술 스택, 주요 구현 내용, 실험 결과 및 결론 등을 한국어로 상세하게 작성한 README 파일입니다.
  • fraud-detection/README.md: 기존 영어 README 파일에 한국어 README 파일 링크를 추가했습니다.

변경된 파일 목록

  • fraud-detection/README.ko.md
  • fraud-detection/README.md
  • fraud-detection/knn_k_sweep.py
  • fraud-detection/results/k_sweep.csv (새로 생성됨)

추가/삭제된 코드 라인 수

  • 총 추가 라인: 167
  • 총 삭제 라인: 0

핵심 코드 설명

fraud-detection/knn_k_sweep.py 스크립트 내에서 kNN 그래프를 생성하는 부분은 다음과 같습니다.

def build_knn_edges(X, k):
    nn = NearestNeighbors(n_neighbors=k + 1)
    nn.fit(X)
    distances, indices = nn.kneighbors(X)

    n = len(X)
    src = cudf.Series(cp.arange(n)).repeat(k + 1).reset_index(drop=True)
    dst = indices.values.reshape(-1)
    dist = distances.values.reshape(-1)

    edges = cudf.DataFrame({"src": src, "dst": cudf.Series(dst), "distance": cudf.Series(dist)})
    edges = edges[edges["src"] != edges["dst"]]
    edges["weight"] = 1.0 / (1.0 + edges["distance"])

    lo = edges[["src", "dst"]].min(axis=1)
    hi = edges[["src", "dst"]].max(axis=1)
    edges["lo"], edges["hi"] = lo, hi
    edges = edges.groupby(["lo", "hi"], as_index=False)["weight"].max()
    edges = edges.rename(columns={"lo": "src", "hi": "dst"})
    return edges[["src", "dst", "weight"]]

이 함수는 입력 데이터 X와 이웃 수 k를 받아, 각 데이터 포인트에 대해 k개의 최근접 이웃을 찾습니다. 이후 거리 기반의 가중치를 부여하여 양방향 그래프 엣지 리스트를 생성합니다.

기술적 의사결정

이번 작업에서는 별도의 기술적 의사결정 사항은 없었습니다. 기존에 사용하던 RAPIDS 라이브러리(cuDF, cuML, cuGraph)를 그대로 활용하여 kNN 그래프 구축 및 Louvain 커뮤니티 탐지를 구현했습니다.

배운 점 및 개선점

  • 배운 점: Louvain 커뮤니티 탐지 알고리즘의 성능이 kNN 그래프의 k 값에 민감하게 반응한다는 것을 확인했습니다. k 값이 너무 작으면 사기 거래를 충분히 포착하지 못하고, 너무 크면 정상 거래와 혼합되어 사기 커뮤니티의 식별력이 떨어질 수 있습니다.
  • 개선점: knn_k_sweep.py 스크립트를 실행하여 얻은 results/k_sweep.csv 파일의 데이터를 분석하여, 어떤 k 값이 가장 좋은 성능을 보이는지 명확히 파악해야 합니다. 이를 바탕으로 최적의 k 값을 선정하여 기존 모델에 적용해야 합니다.
  • 다음 단계 계획:
    1. results/k_sweep.csv 파일을 분석하여 최적의 k 값을 결정합니다.
    2. 결정된 최적의 k 값을 사용하여 fraud-detection/knn_louvain.py 스크립트의 kNN 그래프 생성 부분을 수정하거나, 해당 스크립트에서 k 값을 동적으로 설정하도록 변경합니다.
    3. 한국어 README 파일을 기반으로 프로젝트 소개를 업데이트합니다.

참고 자료