이득:
- 데이터 유출 유형(대상, 시간, 전처리, 그룹화된 행)을 인식하고 '너무 좋음' 점수를 알람으로 쿼리하는 기능
- 테스트 세트, 파이프라인의 조기 분리 및 올바른 분할(연대순/그룹화)로 누출 방지 기능
- 고정 시드, 버전 제어 및 수동 단계 제거를 통해 분석을 재현 가능하게 만드는 기능
데이터 과학에는 가장 많은 노력을 낭비하는 두 가지 실수가 있으며, 둘 다 모든 것이 "괜찮아 보이는" 순간 재앙으로 이어지기 때문에 교묘합니다. 첫 번째는 데이터 유출입니다. 모델은 테스트 세트에서는 훌륭하게 작동하지만 프로덕션에서는 충돌이 발생합니다. 두 번째는 재현 불가능성입니다. 6개월 후에 분석을 실행하면 완전히 다른 결과가 나옵니다. 본 단원에서는 이 두 가지 함정을 깊이 있게 파악하고 피하는 데 전념하고 있습니다. AI는 두 가지 위험을 모두 증가시킬 수 있지만(빠른 생성, 숨겨진 누출 제안, 수동 조치 수행을 더 쉽게 만들어줌) 올바르게 사용하면 위험을 줄일 수도 있습니다. 차이점은 규율에 있습니다.
데이터 유출: 투시 모델
데이터 유출은 모델이 훈련 중에 실제 예측 당시에는 갖고 있지 않은 정보를 보는 경우입니다. 모델은 이 정보를 사용하여 "속임수"를 사용하여 테스트 세트에서는 훌륭해 보이지만 해당 정보가 없으면 프로덕션에서는 충돌이 발생합니다. 누출의 증상은 거의 항상 동일합니다. 사실이라고 믿기에는 너무 좋습니다. 99%의 정확도를 보고 기뻐하기 전에 누출을 찾아야 합니다.
주요 누출 유형은 다음과 같습니다.
1. 목표 누출: 기능은 목표의 결과입니다. "취소됨" 예측에서 "취소 날짜" 또는 "환불 금액" 열은 목표의 결과입니다. 결과가 명확한 경우에만 채워집니다.
2. 시간 누출: 미래의 정보를 과거로 가져옵니다. '최근 30일 평균'을 계산할 때 예측일 이후의 날짜를 포함하거나 시계열을 무작위로 나눕니다.
3. 전처리 유출: 학습/테스트 분할 이전의 모든 데이터에서 스케일링, 채우기, 코딩과 같은 변환을 학습합니다. 테스트 데이터의 평균화는 훈련을 방해합니다.
4. 중복/그룹화된 행 누출: 동일한 사람에게 속한 행이 훈련과 테스트 모두에 존재합니다(다른 세트에서 동일한 환자가 두 번 방문함). 모델은 그 사람을 기억합니다.
누출 유형
어떻게 태어나나요?
예방하는 방법
타겟 누출
대상의 결과인 컬럼
"예측시에 가지고 있는가" 테스트
시간 누출
미래를 과거로 가져오다
연대순 구분, 창 제어
전처리 누출
분할 전 변환
파이프라인, 훈련만으로 딱 들어맞음
그룹화된 행 누수
두 세트의 동일한 장치
그룹별로 분할(GroupKFold)
누출을 방지하는 유일한 규율
모든 유형의 누출에 대한 일반적인 솔루션은 다음 한 문장으로 요약됩니다. 실제 미래를 모방하기 위해 가능한 한 빨리 테스트 세트를 격리하고 아무것도 "가르치지" 마십시오. 실제로 이는 먼저 분할한 다음 훈련을 통해서만 모든 변환을 학습하고 이를 파이프라인(단일 체인의 모든 단계를 수집하는 구조)에 적용하는 것을 의미합니다. 각 기능에 대해 "예측 시점에 이 정보가 있습니까?"라는 질문을 해보세요. 시간이 있으면 시간순으로 나누세요. 동일한 단위가 반복되는 경우 그룹별로 나누어 사용하세요.
주의: 누출의 가장 위험한 측면은 누출이 성공으로 나타난다는 것입니다. 나쁜 모델은 분명 좋지 않은 결과를 낳고 주목을 받을 것입니다. 유출된 모델은 훌륭하게 작동하고 모두를 만족시키며 생산에 투입됩니다. 여기서 붕괴가 시작됩니다. 이것이 바로 "매우 좋은" 결과가 축하의 원인이 아니라 경각심을 불러일으키는 이유입니다.
재현성: 동일한 결과를 두 번 얻음
재현성은 나중에 다른 컴퓨터에서 분석을 다시 실행할 때 동일한 결과를 얻을 수 있는 능력입니다. 이것이 없으면 귀하의 분석은 부수적인 것이지 과학적이지는 않습니다. 재현성을 저해하는 주요 원인 및 해결 방법:
수동 단계: Excel에서 셀을 수동으로 변경하고 차트를 수동으로 편집합니다. 해결 방법: 각 단계를 코드로 작성하세요.
고정되지 않은 무작위성: 모델 훈련, 샘플링, 분할에는 무작위성이 포함됩니다. 해결 방법: 랜덤 시드(랜덤 생성기의 초기 값)를 수정합니다(random_state=42).
버전 변경: 라이브러리 버전이 변경되면 결과가 변경될 수 있습니다. 해결 방법: 종속성(requirements.txt, 환경 파일)을 수정합니다.
기록 보관 없음: 어떤 데이터, 어떤 코드, 어떤 매개변수가 사용되었는지 명확하지 않습니다. 해결책: 버전 관리(Git — 코드의 모든 버전을 저장하는 시스템) 및 데이터 버전 관리.
"내 컴퓨터에서만 작동합니다.": 해결 방법: 환경을 문서화하고 가능하면 컨테이너(Docker)를 사용합니다.
세 개의 미니 케이스
사례 1 - 타겟 누출. 건강분석에서는 '환자의 재입원 여부'를 예측하는 데 '퇴원 후 투약' 항목이 등장했다. 이 열은 환자가 퇴원한 후에만 채워졌습니다. 모델은 96%, 생산에서는 61%를 제공했습니다. 8주간의 프로젝트는 쓰레기였습니다. 교훈: 각 특징에 대해 "예측 시점에 존재하는가?"라고 묻습니다.
사례 2 - 전처리 누출. 한 팀은 모든 데이터를 확장한 다음 분할했습니다. 테스트 데이터의 평균은 스케일링에 포함되었습니다. 이력서 점수 89%, 실제 제작 76%. 파이프라인으로 전환하고 훈련을 통해서만 변환에 대해 배웠을 때 가짜 성공은 사라졌습니다. 교훈: 먼저 나누고 나중에 변환하세요.
사례 3 - 재현 실패. 한 분석가는 3개월 후 경영진에게 제시한 차트를 업데이트하고 싶었지만 어떻게 작성했는지 기억이 나지 않았습니다. 많은 단계가 Excel에서 수동으로 수행되었습니다. 결과는 뜻대로 되지 않았고 신뢰도 흔들렸다. 교훈: 수동 단계가 없으며 모든 것이 코드와 Git에 있습니다.
복사 가능한 템플릿 4개
1) 누출 검사:
귀하의 역할: 누출 검사관. 목표: "churn"(0/1), 예측 기준 날짜: Record_date. 이 기능 목록을 알려 드리겠습니다. 각 기능에 대해: (a) 목표의 결과입니까, (b) 예측 시점에 사용할 수 있습니까, (c) 시간 창에 미래가 포함됩니까? '안전하지 않음/의심함/누출'로 표시하고 이유를 작성하세요. 기능: [목록]
2) 누출 없는 파이프라인:
sklearn 파이프라인 설정: 첫 번째 분할 훈련/테스트(층화, 시드=42), 그런 다음 모든 전처리(대체, 크기 조정, 인코딩)를 훈련에서만 파이프라인에 맞춥니다. 코드가 누수되지 않는 이유와 어느 단계를 어디서 배웠는지 설명하세요.
3) 재현성 체크리스트 코드:
분석을 재현 가능하게 만들고 싶습니다. (1) 모든 무작위성에 대한 하드 시드, (2) 사용된 인쇄 라이브러리 버전, (3) 데이터 및 출력에 대한 날짜/버전 태그를 추가하는 코드/구조를 제안합니다. 또한 수동 단계가 없는지 확인하기 위해 체크리스트도 제공해주세요.
4) 그룹화된 파티션(동일 단위 누출):
데이터에는 동일한 customer_id가 여러 행에 존재합니다. 동일한 고객이 교육 및 테스트에 참여하는 것을 방지하는 분할(GroupKFold 또는GroupShuffleSplit, 그룹 = customer_id)을 만듭니다. 분할 후 두 세트 모두에 고객이 없는지 확인하는 코드를 포함합니다.
약한 프롬프트 / 강한 프롬프트
약한 프롬프트:
내 모델은 98%의 정확도를 반환했습니다. 정말 대단하지 않나요? 코드를 최적화하세요.
98%를 축하하면 누출이 숨겨집니다. 최적화하기 전에 이 점수가 실제인지 아닌지 질문해야 합니다.
강력한 프롬프트:
귀하의 역할: 누출 검사관. 내 모델은 테스트 세트에서 98%의 정확도를 반환했는데, 이는 "사실이라고 믿기에는 너무 좋다"고 들립니다. 확인: (1) 대상 결과의 기능이 있는지, (2) 분할 전에 수행된 변환인지, (3) 두 세트의 동일한 단위인지, (4) 시간 누출이 있는지. 의심스러운 점을 나열하십시오. 점수를 고치는 것이 아니라 누출을 찾는 데 집중하십시오.
여기서 높은 점수는 축하해야 할 신호가 아니라 의문을 제기해야 할 신호로 간주됩니다.
일반적인 실수
- "매우 좋은" 결과를 축하합니다. 사실이 되기에는 너무 좋은 점수는 성과가 아니라 누출 경고입니다.
- 나누기 전 모든 데이터의 변환을 학습합니다. 가장 흔한 누출; 먼저 파이프라인으로 분할합니다.
- 시계열을 무작위로 분할합니다. 모델은 미래를 봅니다. 연대순 구분은 필수입니다.
- 동일한 유닛을 두 세트로 나눕니다. 모델은 그 사람을 기억합니다. 그룹별로 나눕니다.
- 수동으로 들어가서 코드를 작성하지 않습니다. 분석은 재현 불가능해집니다. 모든 것이 코드와 Git에 있어야 합니다.
팁: 프로젝트 시작 부분에 두 문장의 "명예 서약"을 작성하십시오. "나는 프로덕션에서 테스트 세트를 보기 전에 어떤 방식으로도 테스트 세트를 건드리지 않았습니다. 모든 단계는 코드에 있고 시드는 수정되었습니다." 이 두 문장에 정직하게 서명할 수 없다면 결과를 아직 신뢰할 수 없습니다.
요약하면
데이터 유출과 재현 불가능성은 데이터 과학에서 가장 비용이 많이 드는 두 가지 자동 오류입니다. 누출은 모델의 미래 비전이며 그 자체가 잘못된 성공으로 나타납니다. 해결책은 테스트 세트를 초기에 분할하고, 훈련(파이프라인)을 통해서만 변환을 학습하고, 각 기능에 "예측 시 해당 기능이 있습니까?"라는 질문을 하고 올바른 분할(연대순/그룹화)을 수행하는 것입니다. 재현성은 동일한 결과를 두 번 얻을 수 있다는 것입니다. 그의 해결책은 수동으로 단계를 제거하고, 시드를 고정하고, 버전을 동결하고, 모든 것을 Git에 보관하는 것입니다. AI는 이러한 위험을 높이거나 줄일 수 있습니다. 결정하는 것은 당신의 규율입니다.
응용과제
구축한 모델(또는 가상의 모델)의 기능 목록을 가져와서 각 기능에 "예측 시 이 정보가 있습니까?"라는 질문을 던지십시오. 서면으로; 누출 후보를 하나 이상 찾으십시오. 그런 다음 분석을 재현 가능하게 만들기 위한 체크리스트를 작성하십시오. 시드가 고정되어 있는지, 수동 단계가 있는지, 버전이 등록되어 있는지, Git에 있는지 등이 있습니다. 결함을 수정하세요.
체크리스트
- [ ] 누출 경고로 "사실이 되기에는 너무 좋음" 점수를 쿼리했습니까?
- [ ] 분할 후의 모든 변환을 훈련을 통해서만 배웠나요?
- [ ] 시간/그룹 구조(연대기/GroupKFold)에 따라 나누어졌나요?
- [ ] 고정 시드로 모든 무작위성을 반복 가능하게 만들었습니까?
- [ ] 수동 단계를 제거하고 코드 및 버전 관리의 모든 내용을 유지했습니까?