Executive Summary
표를 받아 모델을 채점할 때 우리는 대개 한 줄을 한 관측으로 센다. 그런데 값이 똑같은 줄이 여러 번 들어 있으면, 그 반복이 무엇인지부터 정해야 한다. 같은 계좌가 사흘 내내 정상 거래를 한 기록일 수도 있고, 표 두 장을 합치다 한 건이 세 번 복사된 자국일 수도 있다. 8월 27일 arXiv에 올라온 논문 한 편이 이 물음을 이상 탐지 분야의 공개 데이터셋 전부에 걸어 봤다. 이 글은 그 감사가 무엇을 찾아냈고, 세는 단위를 바꿨을 때 성적표가 어떻게 흔들리는지를 본다.
이상 탐지 벤치마크 모음 OddBench의 데이터셋 690개를 행 단위로 전수 대조한 결과, 절반이 넘는 355개에서 학습용 데이터와 시험용 데이터에 똑같은 행이 함께 들어 있었다. 그리고 147개에서는 값이 한 칸도 다르지 않은 두 행에 정상과 이상이 각각 붙어 있었다. 다만 저자는 이것을 곧바로 오류라 부르지 않는다. 같은 행이 반복되는 데에는 정당한 이유도 있는데, 공개된 표만 봐서는 그 이유를 가려낼 수 없다는 것이 이 논문의 본래 주장이다.
1절부터 4절까지는 논문에 적힌 내용이다. 5절은 그 내용에서 이 글이 끌어낸 해석이다.
주요 수치
출처: Deng, arXiv:2609.29580 초록·표 1·실험 절.
355 / 690
학습·시험 데이터가 겹친 데이터셋
두 세트에 값이 완전히 같은 행이 들어 있는 경우로, 전체의 51.4%다
137
정상을 이상으로 채점하는 데이터셋
시험에서 이상으로 매겨지는 행이 학습 때 정상이라고 배운 행과 똑같다
50~61
AUROC이 0.05 넘게 움직인 데이터셋
모델은 그대로 두고 세는 단위만 행에서 값으로 바꿨을 때, 탐지기 네 종류 각각에서
30
1등 탐지기가 뒤바뀐 데이터셋
같은 네 탐지기를 같은 데이터에 걸었는데 세는 단위에 따라 우승자가 달라졌다
690개 데이터셋을 한 줄씩 맞대어 봤다
이상 탐지는 정상 무리에서 튀는 것을 골라내는 일이다. 카드 부정 사용, 설비 고장 징후, 서버 침입 시도 같은 것이 그 대상이다. 이 분야의 연구자들은 새 방법을 내놓을 때마다 공개 데이터셋 모음에 걸어 점수를 매긴다. OddBench는 그런 모음 가운데 하나로, 표 형태의 데이터셋 690개가 학습용과 시험용으로 갈려 들어 있다.
저자가 한 일은 단순하다. 690개 전부를 열어, 값이 한 칸도 다르지 않은 행이 어디에 몇 번 나오는지를 셌다. 근사치나 유사도가 아니라 완전 일치만 따졌다. 그 결과가 논문 표 1이다.
이 분야가 그동안 해 온 점검과는 층이 다르다. 2022년의 ADBench는 데이터셋 57개에 방법 30가지를 걸어 비교했고, 올해 나온 MacrOData는 그 규모를 2,446개로 늘렸다. 표 형태 데이터의 학습에서 데이터를 가르는 방식이 어떤 함정을 만드는지 정리한 작업도 있었고, 표현을 학습해 중복과 라벨 오류가 의심되는 표본을 순위로 뽑아 주는 도구도 나와 있다. 늘어난 것은 견주는 방법의 수와 데이터셋의 수였다. 이 논문이 세는 것은 방법도 데이터셋도 아니라 데이터셋 안의 행이다. 그래서 모델 쪽을 키우는 것으로는 닿지 않는다고 저자는 서론에서 미리 밝힌다. 인코더나 예측 머리만 바꾼 탐지기는 사라진 출처와 개체 번호, 시각과 노출 정보를 되살리지 못하고, 표 데이터를 통째로 학습한 기반 모델을 데려와도 같은 행에는 같은 점수를 내놓을 뿐이다.
각 줄이 뜻하는 바가 조금씩 다르다. 355개는 학습 세트에 있던 행이 시험 세트에도 그대로 들어 있는 경우다. 모델은 이미 본 문제를 시험에서 다시 만난다. 147개는 값이 완전히 같은 행에 정상과 이상이 갈려 붙은 경우로, 학습과 시험을 통틀어 센 수다. 그 가운데 140개는 시험 세트 안에서만 따져도 같은 충돌이 나온다. 그리고 137개에서는 시험이 이상이라고 채점하는 행이 학습 때 정상이라고 가르친 행과 한 글자도 다르지 않다.
마지막 줄이 특히 곤란한 이유는 채점이 성립하지 않기 때문이다. 모델이 그 행을 정상이라 답하면 학습한 대로 답한 것인데 오답 처리된다. 이상이라 답하면 정답 처리되지만 배운 것과 어긋나게 답한 셈이다. 어느 쪽으로도 실력을 측정하지 못한다.
값이 같은데 라벨이 갈리는 행이 있으면, 어떤 모델도 그 둘을 구별할 수 없다. 입력이 같으니 출력도 같을 수밖에 없고, 한쪽은 반드시 틀린다. 저자는 여기서 데이터셋마다 도달 가능한 점수의 천장을 계산했다. 29개 데이터셋은 아무리 좋은 모델을 가져와도 AUROC이 0.99에 닿지 못하고, 17개는 0.95, 7개는 0.90이 상한이다. 남은 거리는 실력 차이가 아니라 데이터가 미리 깎아 둔 몫이다.
아이솔레이션 포레스트를 걸었을 때, 이 충돌이 잦은 데이터셋일수록 발표된 AUROC이 낮았다. 상관은 -0.221로 크지 않지만 우연으로 보기는 어려운 값이다. 겹침이 점수를 부풀리는 쪽이 아니라 깎는 쪽으로 나타난 셈이고, 방금 본 천장과 같은 방향이다. 다만 저자는 이것을 연관일 뿐 인과 추정이 아니라고 못 박는다.
같은 줄이 500번 나왔다는 것은 무슨 뜻인가
여기까지만 보면 벤치마크를 만든 쪽의 부주의를 지적하는 논문처럼 읽힌다. 저자는 그 방향으로 가지 않는다. 서론이 드는 예가 이 논문의 성격을 보여 준다. 어떤 거래 기록 하나가 표 안에 500번 들어 있다고 하자. 조인을 잘못 걸어 한 건이 500번 복사됐을 수 있다. 같은 요청을 되풀이해 보낸 공격의 흔적일 수도 있다. 개체 번호와 시각을 지운 탓에 서로 다른 500건이 똑같아 보이게 된 것일 수도 있다. 그리고 그냥 500번 일어난 정상 거래일 수도 있다.
네 가지는 요구하는 판단이 정반대다. 되풀이 공격이라면 그 반복 자체가 가장 강한 이상 신호다. 조인 사고라면 반복은 지워야 할 잡음이다. 식별자를 지운 탓이라면 500건은 진짜 500건이고 하나로 줄이면 정보가 사라진다. 그런데 표에 적힌 것은 값의 패턴과 그것이 몇 번 나왔는지뿐이다.
| 같은 행이 500번 나온 이유 | 그렇다면 반복은 | 올바른 처리 |
|---|---|---|
| 실제로 500번 일어난 정상 거래 | 업무상 빈도 | 그대로 500건으로 센다 |
| 같은 요청을 되풀이해 보낸 공격 | 이상 신호 그 자체 | 횟수를 탐지에 쓴다 |
| 조인을 잘못 걸어 한 건이 복사됨 | 데이터 생성 과정의 잡음 | 한 건으로 줄인다 |
| 개체 번호와 시각을 지워 같아 보임 | 서로 다른 500건 | 줄이면 정보가 사라진다 |
오른쪽 두 칸이 네 줄 모두 다르다. 그리고 왼쪽 칸을 알아낼 방법이 표 안에는 없다.
논문은 이 곤란을 정리로 못 박는다. 어떤 값이 평균 몇 번 관측되는지는 세 가지의 곱으로 적힌다. 얼마나 오래 지켜봤는가(노출), 업무상 원래 얼마나 자주 일어나는가(빈도), 그리고 데이터를 만드는 과정이 몇 배로 부풀렸는가(복제)다. 문제는 가운데와 끝의 둘이다. 빈도에 어떤 수를 곱하고 복제를 그만큼 나누면 곱은 그대로다. 관측된 값이 아무리 많아도 두 몫을 갈라낼 수 없다는 뜻이고, 저자는 이것을 빈도 원인의 비식별성이라 부른다.
원인을 가르려면 표 바깥의 정보가 있어야 한다. 논문이 드는 것은 넷이다. 같은 대상을 여러 시점에 반복해 관측한 기록, 각 행이 어디서 어떻게 들어왔는지 적은 출처 이력, 개체 식별자, 그리고 값을 일부러 바꿔 보는 개입이다. 이 가운데 하나라도 없으면 중복의 뜻은 정해지지 않는다. 정적인 표 한 장은 답을 주지 않는다.
그래서 논문의 결론은 중복을 어떻게 처리하라는 지시가 아니다. 중복은 신호일 수도, 잡음일 수도, 추가 정보 없이는 해석 불가능한 것일 수도 있다는 세 갈래를 구분해 두고, 각각이 어떤 조건에서 성립하는지를 밝히는 데서 멈춘다. 전역 중복 제거를 권하지 않는 이유도 여기 있다. 중복을 일괄로 지우면 진짜 빈도 정보까지 버리게 된다. 반대로 중복 횟수를 특성 한 칸에 적어 넣는 처방도 저자는 물리친다. 탐지기가 보는 공간의 생김새가 그만큼 일그러지기 때문이다.
세는 단위를 바꾸면 등수가 바뀐다
중복의 뜻을 정하지 않고도 모델은 채점된다. 그 채점표가 얼마나 흔들리는지가 논문의 두 번째 실험이다. 보통 쓰는 AUROC은 한 행을 한 표로 센다. 값이 똑같은 행이 500번 있으면 그 값 하나가 500표를 행사한다. 저자가 견준 다른 방식은 고유한 값마다 한 표만 주는 것이다. 몇 번 나왔든 같은 값이면 한 표다. 논문은 앞을 행 가중, 뒤를 지지 가중이라 부르고, 뒤의 방식으로 계산한 지표에 복제 불변 AUROC이라는 이름을 붙였다. 행을 몇 배로 복제해도 값이 변하지 않는다는 성질을 증명해 둔 지표다.
고전적인 탐지기 네 종류를 690개 데이터셋에 걸어 두 지표를 나란히 재 봤다. 아이솔레이션 포레스트, ECOD, HBOS, COPOD로, 이상 탐지 논문이 기준선으로 늘 데려오는 것들이다. 탐지기와 데이터셋의 짝은 2,760개가 나왔다. 그중 세는 단위만 바꿨는데 AUROC이 0.05 넘게 움직인 경우가 탐지기마다 50개에서 61개 사이였다.
0.05는 작은 폭이 아니다. 모델도 데이터도 하나 바뀌지 않았고 채점할 때 무엇을 한 표로 세느냐만 달라졌는데 그만큼 움직였다. 평균만 보면 아무 일도 없다. 탐지기 네 종류에서 두 지표의 평균 차이는 0.0054에서 0.0112 사이에 머문다. 방금 본 흔들림은 그 평균 아래에 있었다. 부호를 붙인 평균은 개별 데이터셋의 불안정을 설명하지 못한다고 논문은 적는다. 물론 전체가 뒤집힌 것은 아니다. 두 지표가 매긴 순위의 상관은 0.929로 대체로 같은 방향을 가리킨다. 다만 64개 데이터셋에서는 탐지기들의 줄 세우기가 달라졌고, 그중 30개에서는 1등이 바뀌었다.
저자는 여기서 한쪽 편을 들지 않는다. 각 행이 정말 의도된 관측 단위라면 행 가중이 맞는 물음에 답하고 있는 것이고, 중복이 데이터를 만드는 과정에서 끼어든 잡음이라면 복제 불변 지표가 맞는 답을 준다. 어느 쪽인지는 2절에서 봤듯 표만 봐서는 가려지지 않는다. 그래서 논문은 이 지표를 행 가중의 대체재가 아니라 민감도를 확인하는 도구로 쓰라고 적는다. 두 값이 크게 벌어지는 데이터셋이 있다면, 그 데이터셋의 점수는 세는 단위를 정하기 전까지 해석을 미뤄야 한다는 신호다.
생김새와 횟수를 나눠 세는 탐지기
흔들리는 것은 채점표만이 아니다. 행 단위로 학습한 탐지기는 배우는 내용 자체가 기울어진다. 이상 탐지 모델은 정상이 어떤 모양으로 흩어져 있는지를 배우는데, 같은 값이 500번 들어 있으면 그 값 주변이 500배로 두꺼워진 분포를 정상의 모습으로 삼는다. 여러 번 복제된 값일수록 더 정상다워 보이고, 한 번만 나온 값일수록 변두리로 밀린다. 논문은 이것을 행 단위 학습이 중복도에 비례해 기운 법칙을 배우는 일이라 적는다. 평가 천장과 지표 민감도에 이어 세 번째로 따라오는 결과다.
그래서 논문의 뒷부분은 그럼 어떻게 학습시킬 것인가로 넘어간다. 저자가 내놓은 SCOUT은 한 모델 안에 통로를 둘로 나눈다. 하나는 값의 생김새만 본다. 고유한 값마다 한 번씩만 모델을 맞추므로, 같은 행이 몇 번 복제되든 이 통로의 점수는 변하지 않는다. 다른 하나는 얼마나 자주 나왔는지만 본다. 다만 이쪽은 관측 기간이나 노출량 같은 정보가 함께 주어질 때만 켜진다. 생김새와 빈도를 한 공간에 섞지 않는 것이 이 설계의 요점이다.
통제된 모의실험에서 두 통로는 각자 맡은 쪽만 잡아냈다. 생김새로 튀는 이상에 생김새 통로는 0.9854를 냈지만 빈도로만 튀는 이상에는 0.5012로 찍기와 다르지 않았고, 빈도 통로는 그 반대로 0.9946과 0.5351이었다. 나란히 잰 아이솔레이션 포레스트는 빈도 이상에 0.5086, 생김새 이상에 0.9859였다. 같은 요청이 되풀이돼 들어오는 종류의 이상은 보통의 탐지기에 아예 보이지 않는다.
빈도 통로를 켜는 조건에 이 설계의 정직함이 있다. 노출은 그 값이 나타날 기회가 얼마나 있었는지를 뜻한다. 계좌를 몇 달 지켜봤는지, 설비가 몇 시간 돌았는지 같은 것이다. 같은 횟수라도 하루치에서 나온 열 번과 1년치에서 나온 열 번은 다른 이야기다. 이 정보가 없으면 횟수를 해석할 근거가 없으므로 통로를 아예 켜지 않는다. 2절의 비식별성을 모델 구조로 옮겨 놓은 셈이다.
두 통로 모두 보정 절차를 거쳐 허위 경보 비율의 상한을 보장한다. 학습에 쓰지 않고 떼어 둔 정상 데이터에서 점수가 어떻게 퍼져 있는지를 보고 경보 문턱을 잡는 방식으로, 표본이 무한히 많다는 가정 없이도 성립한다. 실제로 데이터셋 100개와 시드 5개로 69만 1,385건을 채점해 보니, 허위 경보 비율을 1%, 5%, 10%로 정했을 때 실제 비율이 그 값에 거의 그대로 따라붙었다. 현장에 이상 탐지 도구를 걸 때는 이 수치부터 묻게 된다.
관건은 이렇게 나눠 세면 성능을 잃는가였다. 고유한 정상 값이 40개에 못 미치는 네 개를 뺀 데이터셋 686개와 시드 5개에서 생김새 통로만 쓴 SCOUT과 행 단위로 학습한 아이솔레이션 포레스트를 맞대어 보니, 일반 AUROC은 SCOUT 쪽이 0.0026 낮았다. 신뢰구간이 0을 걸치는 폭이라 뒤떨어지지 않는다고 판정됐고, 복제 불변 지표로 재면 오히려 0.0049만큼 앞섰다. 적합 한 번에 드는 시간도 0.387초와 0.333초로 큰 차이가 없다.
차이는 복제를 일부러 걸어 봤을 때 드러난다. 정상 행 일부를 인위적으로 여러 번 복사하고 점수 순위가 얼마나 흔들리는지 재 봤더니, 행 단위로 학습한 아이솔레이션 포레스트는 순위 상관이 중앙값 0.9825, 가장 나쁜 경우 0.8883이었다. 6개 데이터셋은 0.95 아래로 내려갔다. 같은 개입에서 SCOUT의 생김새 통로는 순위가 정확히 그대로였다. 근사적으로 비슷한 것이 아니라 계산 정밀도 한계까지 같은 값이다.
실제 데이터에서 어느 쪽이 유리한지는 표마다 갈렸다. 학습 데이터의 중복 비율이 가장 높은 4분위 172개에서는 SCOUT의 일반 AUROC이 0.0104 낮고 복제 불변 지표가 0.0198 높아 두 방식의 간격이 뚜렷하게 벌어졌다. 반면 나머지 4분의 3에서는 그 간격이 0.0006 안쪽이었다. 중복이 적은 표라면 무엇을 한 번으로 세든 결과가 거의 같다는 뜻이고, 이 논의가 절실해지는 것은 같은 값이 두껍게 쌓인 표에서다.
두 통로를 늘 함께 켜는 편이 낫지 않으냐는 물음에는 논문이 자기 실험으로 아니라고 답한다. 생김새로만 튀는 이상에서 둘을 합친 점수는 생김새 통로 단독보다 0.0146 낮았다. 검정을 둘로 나눠 쓰는 값이 그만큼 든다는 뜻이라 기본값을 단독으로 두었다. 빈도 통로가 보태는 폭도 조건을 탄다. 발생률이 특성에 따라 크게 갈리는 경우에는 0.057에서 0.083까지 올라가지만, 그 차이가 약하면 0.003에서 0.006에 그친다. 여섯 가지 비교 모두 통계적으로는 유의했는데, 쓸모를 가른 것은 p값이 아니라 그 폭이었다.
논문이 밝힌 한계는 셋이다. 감사도 탐지기도 값이 완전히 같은 경우만 다룬다. 오타 한 글자, 반올림 자리, 일부 칸만 다른 같은 개체는 이 방법으로 잡히지 않는다. 보정이 주는 보장은 정상 데이터가 어느 순서로 들어와도 성질이 같다는 가정 위에 서 있어서, 시간이 흐르며 성질이 변하거나 보정용 데이터에 이상치가 섞이면 깨진다. 빈도 통로의 효용은 반합성 실험으로만 확인됐는데, OddBench에는 노출 정보가 아예 없기 때문이다.
뼈대를 딥 아이솔레이션 포레스트로 바꿔 본 확장은 데이터셋 100개에서 AUROC이 0.0036 낮아졌고 신뢰구간이 비열등 기준을 넘지 못해, 성공한 확장으로 내세우지 않고 결과만 남겼다. 모의실험에서 유망해 보였던 다른 탐지기 하나는 실제 데이터 20개에서 0.679로, 같은 방식의 아이솔레이션 포레스트 0.705에 못 미쳤다.
페블러스가 이 논문을 주목하는 이유
지금부터는 이 논문을 데이터 품질의 눈으로 다시 읽는다.
데이터 품질을 점검한다고 할 때 우리가 주로 보는 것은 값이다. 빈칸이 있는가, 자릿수가 맞는가, 범위를 벗어난 값이 있는가. 이 논문이 짚은 것은 그 아래층이다. 값은 전부 멀쩡한데, 그 행 하나가 사건 하나를 뜻하는지 여러 건을 뜻하는지가 어디에도 적혀 있지 않다. 이 층에 결손이 있으면 값 검사는 전부 통과한다. 통과한 채로 모델이 학습되고 점수가 매겨진다.
비식별성 정리를 실무의 말로 옮기면 이렇다. 데이터를 다 만든 뒤에는 그 표를 아무리 오래 들여다봐도 답이 나오지 않는다. 답은 만들어지는 자리에 있었다. 어떤 조인을 걸었는지, 어느 칸을 개인정보 때문에 지웠는지, 집계 창을 어떻게 잡았는지가 기록으로 남아 있으면 중복의 뜻이 정해지고, 남아 있지 않으면 끝내 알 수 없다. 출처 이력과 개체 식별자를 남기는 일이 서류 작업이 아니라 나중에 쓸 수 있는 유일한 열쇠인 셈이다.
그리고 이 논문은 중복 제거 버튼을 권하지 않는다. 데이터를 손보는 쪽에서 가장 먼저 손이 가는 처방이 그것인데, 같은 줄을 지우는 순간 진짜 빈도 정보도 함께 사라진다. 먼저 정해야 할 것은 무엇을 한 번으로 셀 것인가이고, 그 선언이 있고 나서야 지울지 살릴지를 고를 수 있다. 중복 제거를 데이터 정제의 기본기로 두고 있다면, 그 앞에 관측 단위를 적는 칸이 하나 필요하다.
이 논문의 실험에서 모델은 하나도 바뀌지 않았는데 30개 데이터셋의 1등이 바뀌었다. 사내 모델 비교표에서 후보 둘의 점수 차이가 0.05 안쪽이라면, 그 차이가 모델에서 온 것인지 표 안의 반복에서 온 것인지 구별할 값이 없는 상태다. 같은 데이터를 행 단위와 값 단위로 두 번 채점해 두 값이 얼마나 벌어지는지 보는 것은 하루면 되는 일이다. 어느 표에서 이 점검이 값을 하는지는 4절이 이미 보여 줬다. 중복이 적은 표에서는 어느 단위로 세든 결과가 거의 같았다. 그러니 먼저 잴 것은 점수가 아니라 자기 테이블의 중복 비율이다.
관측 단위는 데이터를 만든 사람의 머릿속에만 있다가 그 사람이 팀을 옮기면 사라진다. 이 표의 한 줄은 무엇 하나를 뜻하는가, 같은 값이 여러 줄 있으면 그것은 몇 건인가, 이 표를 만들 때 어떤 표와 어떤 표를 합쳤는가. 세 문장이면 충분하고, 스키마 옆이든 데이터 설명 문서든 데이터와 함께 옮겨 다니는 자리에 있으면 된다. 나중에 이 표로 모델을 채점하는 사람이 자기 점수를 해석할 수 있느냐가 여기에 달려 있다.
평가셋의 무결성은 페블러스가 전에도 짚은 자리다. 시험 문제가 학습 데이터에 이미 들어가 있던 대형 언어 모델 벤치마크 오염을 다뤘고, 같은 산모의 기록이 학습과 시험에 갈려 담겨 성능이 부풀었던 조산 예측 벤치마크도 살펴봤다. 이번 이야기는 그 둘보다 한 층 아래다. 문제가 새어 나간 것도 아니고 환자를 갈라 담은 것도 아니다. 나누는 방법을 고치는 것으로는 닿지 않는 자리에 있다. 한 줄이 무엇을 세는 단위인지를 아무도 적어 두지 않았다는 이야기다.
그러니 자기 테이블을 여는 질문은 하나다. 값이 완전히 같은 행이 우리 학습 데이터와 평가 데이터에 몇 쌍이나 들어 있는가. 세어 본 적이 없다면 세어 볼 일이고, 세어 봤는데 있다면 그다음 질문은 그 반복이 장부에 실제로 일어난 횟수인지 데이터를 옮기는 과정에서 생긴 자국인지다. 두 번째 질문에 답할 수 있는 기록이 없다면, 그 데이터로 매긴 점수는 아직 해석 이전에 있다.
여기까지 읽어 주셔서 감사하다. 이 글이 따라간 논문은 arXiv에서 전문을 무료로 볼 수 있다. 여러분의 조직에서 쓰는 평가 데이터에 값이 완전히 같은 행이 몇 쌍 들어 있는지 한 번 세어 보시고, 그 결과를 이야기해 주시면 좋겠다.
참고문헌
1차 소스
- 1.Deng, J. (2026). "When Identical Rows Disagree: From Benchmark Identifiability to Replication-Robust Anomaly Detection." arXiv preprint.
비교 대상 연구
- 2.Han, S., Hu, X., Huang, H., Jiang, M. & Zhao, Y. (2022). "ADBench: Anomaly Detection Benchmark." Advances in Neural Information Processing Systems, Vol. 35.
- 3.Ding, X., Klüttermann, S., Wen, H., Chen, Y. & Akoglu, L. (2026). "MacrOData: New Benchmarks of Thousands of Datasets for Tabular Outlier Detection." Proceedings of the ACM SIGKDD Conference on Knowledge Discovery and Data Mining.