자카드 유사도(Jaccard Similarity)란? AI에서 두 집합의 겹침 비율을 평가하는 지표
TL;DR
자카드 유사도는 두 집합이 함께 포함한 원소 수를 한쪽에라도 포함된 원소 수로 나눈 값입니다. AI가 붙인 태그와 정답 태그의 겹침을 평가할 때 씁니다. 함께 제외한 항목은 분모에 넣지 않으며, 문서별 평균과 라벨별 평균은 다른 점수입니다. 두 집합이 모두 비었을 때의 처리와 유사도·거리의 방향도 구분합니다.
핵심 3줄 요약
- 핵심 1
교집합을 합집합으로 나눕니다. 겹친 항목을 한 번 세고 빠뜨린 항목과 잘못 붙인 항목도 분모에 반영합니다. - 핵심 2
함께 없는 항목은 세지 않습니다. 존재하지 않는 태그를 많이 맞힌 효과가 점수를 부풀리지 않도록 양성 집합을 비교합니다. - 핵심 3
평균 방식과 빈 집합 규칙을 남깁니다. 같은 예측도 집계 축과 처리 정책에 따라 다른 숫자로 요약됩니다.
이 글에서 다룰 내용
- 자카드 유사도의 한 문장 정의
- 문의 태그로 확인하는 교집합과 합집합
- 함께 없는 항목을 제외하는 계산 원리
- 문서별·라벨별 평균과 빈 집합 처리
- 해밍 손실·F1·IoU와의 관계
- 실전 평가에서 고정할 입력과 체크리스트
- 점수 해석의 주의점과 자주 묻는 질문
자카드 유사도를 한 문장으로 정의하면 무엇인가요?
자카드 유사도(Jaccard Similarity)는 두 유한 집합의 합집합 크기 중 교집합 크기가 차지하는 비율을 나타내는 지표입니다.
자카드 지수나 자카드 계수라고도 부릅니다. 공통 원소가 없으면 0이고 같은 비어 있지 않은 집합이면 1입니다. 여기서 집합은 순서와 중복 횟수를 구분하지 않습니다. 같은 태그를 두 번 출력해도 서로 다른 정답 두 개를 맞힌 것으로 세지 않습니다.
scikit-learn 공식 가이드는 정답 라벨 집합과 예측 라벨 집합의 겹침을 이 방식으로 정의합니다. 집합 하나를 태그별 0·1 벡터로 나타내도 원리는 같습니다. 두 입력의 태그 목록과 열 순서가 같아야 올바른 항목끼리 비교합니다.
한 줄 정리: 자카드 유사도는 두 목록에 등장한 서로 다른 항목 중 공통 항목의 비율입니다. 태그 이름 자체의 의미가 비슷한지는 따로 판단합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 문의 하나에 배송·환불·계정 태그를 붙인다고 가정해 보겠습니다. 검수한 정답은 배송과 환불이고 AI의 예측은 배송과 계정입니다. 실제 모델 성능을 측정한 자료가 아니라 계산 원리를 설명하는 예시입니다.
- 정답 집합은 {배송, 환불}, 예측 집합은 {배송, 계정}입니다.
- 교집합은 {배송}으로 원소가 1개입니다.
- 합집합은 {배송, 환불, 계정}으로 원소가 3개입니다.
- 자카드 유사도는
1 / 3으로 약 0.3333입니다.
환불을 빠뜨린 일과 계정을 잘못 붙인 일이 모두 합집합을 키웁니다. 정답과 예측의 원소 수를 단순히 더하면 공통인 배송을 두 번 세므로 합집합 크기가 되지 않습니다. 중복을 제거한 전체 목록을 분모로 사용합니다.
여기에 정답도 예측도 붙이지 않은 불만·결제 태그를 추가해도 교집합과 합집합은 그대로입니다. 이 예시의 자카드 유사도는 바뀌지 않습니다. 함께 없는 항목을 맞혔다는 이유로 점수가 올라가지는 않습니다.
이 글의 분수와 평균 예시는 Python 표준 라이브러리로 검산했습니다. scikit-learn이나 SciPy 함수를 실행한 측정값, 실제 문의 분류기의 벤치마크를 뜻하지 않습니다.
쉬운 예시: 공통 태그가 하나라는 사실만으로는 부족합니다. 겹친 비율을 알려면 두 목록에 등장한 전체 태그 수도 함께 봅니다.
왜 AI에서 자카드 유사도가 중요한가요?
여러 정답 중 일부를 맞힌 결과를 구분합니다
문서 하나에 태그를 여러 개 붙이는 다중 라벨 분류에서는 일부만 맞는 결과가 흔합니다. 모든 태그가 일치해야 성공으로 세는 문서 완전 일치율과 달리, 자카드 유사도는 정답과 예측의 부분 겹침을 반영합니다. 단일 클래스 선택 문제와 입력 형식을 구분하는 이유입니다.
함께 제외한 다수 항목의 영향을 분리합니다
후보 태그가 많고 문서마다 실제 태그는 적으면 0인 칸이 대부분입니다. 자카드 유사도는 어느 쪽에라도 등장한 태그만 분모에 포함합니다. 그렇다고 모든 평가 문제를 해결하지는 않습니다. 정답 라벨의 누락이나 작은 표본의 불확실성은 그대로 남습니다.
핵심 인사이트: 높은 점수는 주어진 정답 집합과 많이 겹친다는 뜻입니다. 태그 정의가 정확한지, 누락 비용이 감당 가능한지까지 증명하지는 않습니다.
자카드 유사도는 어떤 순서로 계산하나요?
같은 항목의 존재 여부를 맞춥니다
행은 문서이고 열은 태그인 표시 행렬을 준비합니다. 예시에 사용한 태그 순서가 배송·환불·계정이면 정답은
[1, 1, 0]
이고 예측은
[1, 0, 1]
입니다. 1은 포함, 0은 제외를 뜻합니다. 두 배열의 열 이름을 먼저 대조합니다.
공통 양성과 한쪽에만 있는 양성을 셉니다
정답과 예측이 모두 1인 칸은 참양성 TP입니다. 예측에만 있는 항목은 거짓양성 FP, 정답에만 있는 항목은 거짓음성 FN입니다. 양성 집합의 자카드 계산은
TP / (TP + FP + FN)
입니다. 둘 다 0인 참음성 TN은 이 분모에 없습니다.
어느 단위의 점수를 평균할지 정합니다
문서마다 계산한 값을 평균하는 것과 모든 문서의 TP·FP·FN을 먼저 합쳐 한 번 나누는 것은 다릅니다. 라벨마다 계산한 뒤 평균할 수도 있습니다. 보고서에 점수 이름만 적으면 같은 기준으로 비교했는지 판단하기 어렵습니다.
실전 팁: 점수와 함께 교집합 크기, 합집합 크기, 문서 수와 평균 방식을 보관하세요. 숫자가 달라졌을 때 입력 문제인지 집계 방식의 차이인지 구분하기 쉽습니다.
주요 설정과 반환값은 어떻게 읽나요?
average는 결과를 모으는 축입니다
scikit-learn의
jaccard_score
는 기본
average='binary'
에서
pos_label
로 지정한 양성 클래스의 점수를 반환합니다. 다중 라벨에 기본 설정을 그대로 쓰지 않고 목적에 맞는 평균을 선택합니다.
average=None
이면 라벨별 점수를 배열로 받습니다.
average='samples'
는 다중 라벨에서 문서별 점수의 평균입니다.
average='micro'
는 전체 TP·FP·FN을 합쳐 계산하고,
average='macro'
는 라벨별 점수의 단순 평균입니다.
average='weighted'
는 라벨별 점수에 정답 출현 수를 가중치로 줍니다.
sample_weight
는 문서별 비중이며 태그 열마다 주는 가중치가 아닙니다.
평균의 차이를 보려면 정답 두 행을
[[1, 1, 0], [1, 0, 0]]
, 예측 두 행을
[[1, 1, 1], [1, 0, 0]]
으로 놓습니다. 문서별 자카드는
2 / 3
과 1이므로 samples는
5 / 6
입니다. micro는 공통 양성 3개를 합집합의 총합 4로 나눈
3 / 4
입니다. 라벨별 점수는 1·1·0이므로 macro는
2 / 3
입니다.
빈 집합은 zero_division 정책을 확인합니다
정답과 예측이 모두 비면 합집합 크기가 0이라 기본 분수는 정의되지 않습니다. scikit-learn 문서는 기본
zero_division='warn'
에서 0을 반환하고 경고한다고 설명합니다.
zero_division=1
처럼 다른 정책을 선택하면 빈 문서가 평균에 기여하는 방식도 달라집니다. 빈 문서의 수와 처리 규칙을 함께 남깁니다.
이름이 비슷한 거리 함수는 방향이 반대입니다
SciPy의
scipy.spatial.distance.jaccard
는 유사도가 아닌 비유사도, 곧 거리를 반환합니다. 비어 있지 않은 합집합에서 거리는
1 - J
입니다. 첫 예시의 거리는
2 / 3
이며 낮을수록 비슷합니다. 현재 문서는 두 영벡터의 거리를 0으로 정하므로 scikit-learn 기본 빈 집합 점수에 그대로 대입하지 않습니다.
SciPy 문서는 수치 입력을 불리언으로 변환한다고 안내합니다. 횟수 2와 9의 크기 차이를 이 함수가 보존한다고 기대하면 안 됩니다. 옵션
w
는 벡터 위치별 음수가 아닌 가중치입니다. scikit-learn의 문서별 가중치와 같은 축이 아닙니다.
자카드 유사도와 헷갈리는 용어는 무엇이 다른가요?
해밍 손실과는 분모가 다릅니다
해밍 손실은 전체 태그 판정 칸 중 틀린 칸의 비율입니다. 첫 예시는 3칸 중 2칸이 달라
2 / 3
입니다. 함께 없는 태그 열 두 개를 추가하면 오류 수는 그대로지만 해밍 손실은
2 / 5
가 됩니다. 자카드는 양성 집합이 그대로라
1 / 3
을 유지합니다.
F1과 연결되지만 같은 숫자는 아닙니다
F1 점수는
2 * TP / (2 * TP + FP + FN)
으로 계산합니다. 첫 예시의 F1은
1 / 2
입니다. 동일한 집합 또는 동일하게 합산한 TP·FP·FN에서
F1 = 2 * J / (1 + J)
가 성립합니다. 문서별·라벨별 평균을 낸 뒤에는 그 평균값끼리 이 식으로 변환된다고 가정하지 않습니다.
IoU는 영역의 겹침에 적용한 같은 원리입니다
이미지의 두 영역에서 교집합 면적을 합집합 면적으로 나누는 IoU도 같은 겹침 비율입니다. 같은 크기의 이진 마스크에서 전경 픽셀 집합을 비교하면 자카드 계산과 대응합니다. 비최대 억제는 상자 점수와 IoU로 후보를 고르는 절차이고, 여기서는 집합의 점수를 계산하는 원리를 다룹니다. 점수 자체가 후보 제거 알고리즘은 아닙니다.
비교 정리: 해밍 손실은 전체 칸의 오류 비율, 자카드는 양성 집합의 겹침 비율, F1은 TP에 다른 비중을 준 지표입니다. IoU라는 이름이 쓰여도 무엇을 원소나 면적으로 셌는지 확인합니다.
실전에서는 어디에 쓰이나요?
AI가 생성한 여러 태그를 평가합니다
문의 분류·문서 주제·이미지 태그처럼 결과가 집합인 작업에 적용합니다. 모델과 프롬프트를 바꾸기 전후에 같은 정답 자료와 태그 체계를 사용합니다. 문서별 점수만 보지 말고 중요한 라벨의 누락과 불필요한 태그도 원문에서 확인합니다.
항목 집합의 공통 부분을 점검합니다
두 문서가 포함한 단어 집합이나 두 도구가 추출한 항목 집합의 겹침을 계산하는 데도 응용합니다. 이때 자카드가 보는 것은 미리 정한 원소의 동일성입니다. 동의어를 같은 항목으로 묶을지, 띄어쓰기와 대소문자를 어떻게 처리할지 정한 뒤 비교합니다. 의미 검색을 대신하는 점수로 단정하지 않습니다.
자카드 유사도를 적용할 때 어떤 순서로 확인하나요?
1. 집합과 정답의 정의를 고정합니다
문서별 태그인지 전경 픽셀인지 비교 단위를 적습니다. 중복 항목 제거, 태그 이름 통일과 미확인 정답 처리 규칙도 정합니다. 검수하지 않은 항목을 자동으로 음성 처리하면 올바른 예측을 오탐으로 셀 수 있습니다.
2. 작은 입력과 집계 축을 검산합니다
완전 일치, 겹침 없음, 누락, 오탐과 양쪽 빈 집합을 각각 시험합니다. 문서 행과 태그 열의 대응을 확인한 다음 평균을 고릅니다. 빈 집합 처리와 제외 라벨 설정까지 기록해야 나중에 같은 평가를 재현합니다.
3. 독립 평가와 실패 사례를 남깁니다
확률을 태그로 바꾸는 임계값은 검증 자료에서 정하고 별도의 테스트 자료에 적용합니다. 테스트 점수를 본 뒤 유리하도록 평균이나 태그 목록을 바꾸지 않습니다. 전체 점수와 함께 문서별 실패, 라벨별 정밀도·재현율을 저장해 수정 대상을 찾습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 확률과 최종 집합을 구분합니다. 0.8 같은 연속 확률을 정답 태그와 직접 비교하는 지표가 아닙니다. 정해진 임계값으로 최종 집합을 만든 뒤 계산하며, 확률이 믿을 만한지는 별도 평가가 필요합니다.
둘째, 집합 크기와 평균 방식의 차이를 숨기지 않습니다. 많은 태그가 붙은 문서와 적은 문서가 micro와 samples에 기여하는 방식은 다릅니다. 운영 자료의 구성이 바뀌면 동일 모델의 평균도 달라질 수 있습니다.
셋째, 빈 문서와 빠진 정답을 구별합니다. 실제 태그가 없는 문서와 아직 라벨링하지 않은 문서는 다릅니다. 빈 집합의 점수를 1로 정하는 정책도 검수 완료를 대신하지 않습니다. 평가 범위 밖 항목을 어떻게 제외했는지 남깁니다.
넷째, 높은 겹침을 업무 성공과 동일시하지 않습니다. 가벼운 오탐 하나와 중요한 안전 태그의 누락 하나가 기본 점수에서 같은 크기로 반영될 수 있습니다. 오류의 피해와 사람 검토 기준은 별도로 정합니다.
주의: 공통 항목이 많아도 정답 자체가 틀리면 평가도 틀립니다. 점수 하나로 사실성·안전성·운영 적합성을 자동 승인하지 않습니다.
자주 묻는 질문
Q1. 자카드 유사도는 높을수록 좋은가요?
같은 정답·태그 체계·평균 방식에서는 높을수록 두 집합이 많이 겹칩니다. 서로 다른 데이터나 빈 집합 정책의 점수는 숫자만으로 직접 비교하지 않습니다.
Q2. 두 목록의 순서가 달라도 같은가요?
집합의 원소가 같으면 순서는 영향을 주지 않습니다. 다만 0·1 배열은 위치가 태그를 나타내므로 정답과 예측의 열 순서는 반드시 맞아야 합니다.
Q3. 없는 태그를 함께 맞히면 점수가 올라가나요?
기본 양성 집합 자카드는 둘 다 없는 항목을 세지 않습니다. 함께 0인 열만 추가하면 교집합과 합집합은 변하지 않습니다. 전체 판정 칸을 분모로 쓰는 해밍 손실과 다릅니다.
Q4. 문서별 평균과 micro는 같은가요?
일반적으로 다릅니다. 문서별 평균은 각 문서의 비율을 먼저 계산합니다. micro는 TP·FP·FN을 전체에서 합친 뒤 나눕니다. 앞의 두 문서 예시에서도 서로 다른 분수가 나옵니다.
Q5. SciPy의 jaccard 결과가 클수록 비슷한가요?
아닙니다. 확인한 SciPy 함수는 거리를 반환하므로 작을수록 비슷합니다. scikit-learn의 유사도 점수와 방향뿐 아니라 양쪽 빈 입력의 기본 처리도 따로 확인합니다.
Q6. F1 평균으로 자카드 평균을 계산해도 되나요?
동일한 TP·FP·FN에서 계산한 단일 점수 사이의 변환식과 평균 점수의 관계는 다릅니다. 필요한 자카드 평균은 원래 예측과 정답으로 해당 방식에 맞게 계산합니다.
출처
마무리
자카드 유사도는 교집합 크기를 합집합 크기로 나눈 겹침 지표입니다. AI가 내놓은 여러 태그와 정답의 부분 일치를 읽는 데 유용하며, 함께 없는 항목을 분모에 넣지 않는다는 점이 해밍 손실과의 차이입니다.
감자나라ai님이 평가표에 추가한다면 비교할 집합과 태그 목록부터 고정해 보세요. 문서별·라벨별 평균, 빈 집합 정책과 유사도·거리의 방향을 확인하고 실패 원문을 함께 남깁니다. 같은 조건의 점수를 비교해야 모델 변경의 효과를 해석하기 쉽습니다.
