CUDA-study: 신용카드 사기 탐지 모델 성능 개선 및 문서화
이번 커밋은 신용카드 사기 탐지 프로젝트에서 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.mdfraud-detection/README.mdfraud-detection/knn_k_sweep.pyfraud-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값을 선정하여 기존 모델에 적용해야 합니다. - 다음 단계 계획:
results/k_sweep.csv파일을 분석하여 최적의k값을 결정합니다.- 결정된 최적의
k값을 사용하여fraud-detection/knn_louvain.py스크립트의 kNN 그래프 생성 부분을 수정하거나, 해당 스크립트에서k값을 동적으로 설정하도록 변경합니다. - 한국어 README 파일을 기반으로 프로젝트 소개를 업데이트합니다.