층화 분할과 무작위 분할, 클래스 비율과 평가 조건 구분하기

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 44회 작성일 26-09-29 07:48

본문

분류 데이터를 학습용과 평가용으로 나눌 때 무작위 분할을 했는데 평가 데이터에 드문 클래스가 거의 없는 상황이 생길 수 있습니다. 층화 분할은 이런 문제를 줄이기 위해 클래스 비율을 나눈 집합에서도 비슷하게 유지하려는 방법입니다.

그러나 비율을 맞췄다는 사실이 데이터 누수나 시간 순서 문제까지 해결했다는 뜻은 아닙니다. 이 글은 무작위 분할과 층화 분할의 차이, 재현성 설정, 그룹과 시간 조건의 우선순위를 정리합니다.

숫자는 개념 설명을 위한 가상 예시이며 특정 데이터에서 동일한 분할 결과가 나온다는 보장은 아닙니다.

층화 분할과 무작위 분할, 클래스 비율과 평가 조건 구분하기 관련 설명용 삽화

AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.

핵심 정리
층화 분할은 클래스 비율을 고려하는 분할입니다. 데이터의 독립성이나 시간 순서까지 자동으로 보장하지 않으므로 평가하려는 상황과 그룹 구조를 먼저 확인합니다.


1. 무작위 분할은 샘플을 나누는 기본 방식입니다

무작위 분할은 샘플을 임의의 순서나 선택 규칙에 따라 학습 집합과 평가 집합으로 나누는 방식입니다. scikit-learn의 train_test_split은 배열을 함께 분할하는 도구이며 무작위 상태와 층화 여부 등을 지정할 수 있습니다.

같은 샘플의 특징과 정답을 따로 섞으면 대응이 깨질 수 있으므로 같은 분할 기준을 사용해야 합니다. 설명용으로 문서 100개가 있고 그중 특정 클래스가 10개라고 가정합니다.

평가용 20개를 무작위로 골랐을 때 해당 클래스가 정확히 2개 포함된다고 보장되지는 않습니다. 이 숫자는 비율과 실제 선택 결과가 다를 수 있다는 점을 보여 주기 위한 것입니다.

작은 데이터나 드문 클래스에서는 분할 결과의 차이가 평가 해석에 영향을 줄 수 있습니다. 분할 뒤에는 전체 개수뿐 아니라 각 집합의 클래스별 수량도 확인하는 편이 좋습니다.

관련 공식 문서


2. 층화는 클래스 구성 비율을 고려합니다

층화 분할은 주어진 클래스 정보를 기준으로 각 집합의 비율이 원래 구성과 비슷하도록 나누려는 방식입니다. scikit-learn에서는 stratify에 클래스 레이블을 전달하는 형태로 사용할 수 있습니다.

단순히 데이터를 무작위로 나눈 뒤 부족한 클래스를 복사해 넣는 절차와는 다릅니다. 앞의 가상 예시에서 전체의 특정 클래스 비율이 10퍼센트라면 평가 집합에서도 그와 비슷한 구성을 목표로 삼는다고 이해할 수 있습니다.

실제 정수 개수와 분할 크기 때문에 모든 비율을 정확히 맞출 수 있는 것은 아닙니다. 데이터가 너무 적거나 드문 클래스의 수가 부족하면 원하는 분할을 구성하지 못할 수 있으므로 함수의 조건과 오류를 확인해야 합니다.

층화를 켰다는 설정만 기록하지 말고 사용한 레이블과 최종 수량을 함께 남기는 것이 좋습니다. 그래야 어떤 특성을 유지하려고 했는지 다른 사람이 이해할 수 있습니다.

관련 공식 문서

관련 공식 문서


3. 같은 사용자의 자료는 그룹 조건을 먼저 봅니다

한 사용자가 만든 여러 문서나 한 장치에서 반복 수집한 기록처럼 샘플 사이에 묶음이 있을 수 있습니다. 같은 그룹의 자료가 학습과 평가에 동시에 들어가면 실제로 평가하려던 새 그룹에 대한 성능과 다른 조건이 될 수 있습니다.

클래스 비율을 유지했다고 이런 중복이 자동으로 사라지지는 않습니다. scikit-learn의 GroupKFold는 그룹이 겹치지 않도록 나누는 도구의 한 예입니다.

적용할 방법은 평가 목적과 데이터 구조에 맞춰 선택해야 합니다. 설명용으로 사용자가 세 명이고 각자 여러 문서를 쓴 상황이라면 문서 수만 세기보다 사용자 식별자가 어느 집합에 있는지도 확인할 수 있습니다.

새 사용자를 대상으로 한 성능이 목표인지 기존 사용자의 새 문서를 대상으로 하는지에 따라 질문이 달라집니다. 그룹 구분이 필요한 자료를 임의로 행 단위로만 섞고 높은 점수만 보고하는 것은 피해야 합니다.

관련 공식 문서


4. 미래 예측이라면 시간 순서가 중요합니다

과거 자료로 학습해 이후 시점의 결과를 예측하려는 문제에서는 시간 순서가 평가 조건에 포함됩니다. 데이터를 무작위로 섞으면 미래 자료를 학습에 사용하고 과거를 평가하는 형태가 될 수 있습니다.

scikit-learn의 TimeSeriesSplit은 시간 순서를 고려하는 분할 도구이며 문서에 적용 조건도 설명돼 있습니다. 단순히 이 도구를 선택하면 모든 시계열 문제가 해결된다는 뜻은 아닙니다.

관측 간격과 특성 생성 시점, 평가 구간의 의미도 확인해야 합니다. 예를 들어 다음 달의 분류 결과를 예측하는 목적이라면 전체 기간의 클래스 비율을 맞추는 것보다 실제 예측 시점에 알 수 있던 자료만 사용하는지가 먼저입니다.

클래스 비율이 시간에 따라 달라지는 현상 자체가 평가 조건일 수도 있습니다. 분할 목적을 한 문장으로 적고 그 목적에 맞는 순서와 그룹 제약을 먼저 정한 뒤 비율 유지 여부를 검토합니다.

관련 공식 문서


5. 재현성 설정과 좋은 평가를 구분합니다

random_state 같은 설정은 분할을 다시 확인하고 실험을 비교하는 데 도움이 됩니다. 그러나 동일한 분할을 재현할 수 있다는 사실이 그 분할이 평가 목적에 적합하다는 증거는 아닙니다.

높은 점수가 나오는 분할을 여러 번 찾아 최종 결과로 선택하면 비교의 의미가 달라질 수 있습니다. 실험 기록에는 분할 방식과 난수 설정, 데이터 버전, 집합별 수량을 함께 적습니다.

scikit-learn 문서는 층화가 일부 실용적인 문제를 줄이지만 평가 변동성을 작게 보이게 할 수도 있다고 설명합니다. 비율이 고르게 유지됐다는 이유만으로 불확실성이 사라졌다고 해석하지 않습니다.

설명용 보고서를 만든다면 평균 점수와 함께 어떤 조건을 바꾸지 않았는지, 어떤 자료에 적용한 결과인지 적을 수 있습니다. 재현성은 같은 조건을 다시 확인하는 기반이고 평가의 타당성은 목적과 데이터 구조를 별도로 검토해야 하는 문제입니다.

관련 공식 문서


6. 분할 후 수량과 경계를 직접 점검합니다

모델을 학습하기 전에 학습·검증·최종 평가 집합의 역할을 정리하고 샘플 식별자가 겹치는지 살펴봅니다. 그룹 구분이 있다면 그룹 목록의 교집합을 확인하고 시간 조건이 있다면 각 집합의 기간을 비교합니다.

클래스별 수량은 전체 비율과 함께 보되 너무 적은 클래스가 있는지 따로 확인합니다. 전처리 과정도 평가 데이터를 미리 학습에 사용하지 않도록 분할 경계를 따라야 합니다.

이 점검은 모델 점수를 높이기 위한 조정이 아니라 어떤 질문에 대한 결과인지 명확히 하는 과정입니다. 가상 문서 분류 실험이라면 전체 문서 수, 사용자 수, 기간, 클래스 수량을 한 표에 적어 서로 다른 분할의 조건을 비교할 수 있습니다.

이 글의 예시처럼 단순한 숫자로 연습한 뒤 실제 데이터에서는 중복과 그룹, 시간 정보를 함께 확인해야 합니다. 층화 여부 하나보다 평가 상황을 구체적으로 설명하는 능력이 먼저 필요합니다.


7. 자주 묻는 질문

Q1. 층화 분할은 무작위성을 없애는 방법인가요?

클래스 비율을 고려하면서 무작위 선택을 사용할 수 있습니다. 비율 조건과 난수 설정은 서로 다른 항목입니다.

Q2. stratify를 쓰면 데이터 누수가 없어지나요?

클래스 구성만 고려하므로 그룹 중복이나 시간 순서 문제는 별도로 확인해야 합니다. 전처리의 학습 범위도 분할 경계를 따라야 합니다.

Q3. 클래스가 아주 적어도 비율을 맞출 수 있나요?

샘플 수와 분할 크기에 따라 구성에 제한이 생길 수 있습니다. 실제 수량과 도구의 조건을 확인하고 오류를 무시하지 않습니다.

Q4. 난수 설정을 고정하면 평가가 공정해지나요?

재현성을 돕지만 평가 목적에 맞는 분할인지까지 보장하지는 않습니다. 데이터 구조와 최종 평가 절차를 함께 검토합니다.


참고 자료

댓글목록

등록된 댓글이 없습니다.