데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
Evidently AI는 머신러닝 모델의 데이터 드리프트, 모델 성능 저하, 대상 드리프트를 실시간으로 탐지하고 시각화하는 오픈소스 모니터링 라이브러리입니다. ML 파이프라인에 쉽게 통합되어 프로덕션 모델의 건강 상태를 지속적으로 추적할 수 있습니다.
입력 데이터 분포 변화를 통계적 검정(PSI, KS, Jensen-Shannon 등)으로 감지합니다.
정확도, 정밀도, 재현율, AUC 등 메트릭을 시간에 따라 추적하고 이상 징후를 알립니다.
예측값과 실제 레이블의 분포 변화를 관찰하여 모델 출력의 신뢰도를 평가합니다.
💡 Tip: Evidently는 단일 노트북부터 대규모 Kubernetes 기반 파이프라인까지 확장 가능합니다.
기존 모니터링 대안(Alibi Detect, WhyLabs, NannyML)과 비교한 Evidently의 주요 차별점은 직관적인 리포트 UI, 다양한 드리프트 검정 방법, 오픈소스 기반의 유연한 커스터마이징입니다.
| 비교 항목 | Evidently AI | Alibi Detect | WhyLabs | NannyML |
|---|---|---|---|---|
| 라이선스 | Apache 2.0 | Apache 2.0 | SaaS/부분 유료 | Apache 2.0 |
| 드리프트 검정 다양성 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 리포트/대시보드 | ✅ HTML, JSON, Colab | ❌ (API 위주) | ✅ SaaS 대시보드 | ✅ PDF/HTML |
| 배포 난이도 | 낮음 (pip install) | 중간 | 낮음 (SDK) | 낮음 |
| 실시간 알림 | ✅ (커스텀 가능) | ❌ | ✅ | ✅ (유료) |
⚠️ 주의: WhyLabs는 클라우드 종속성이 있고, Alibi Detect는 시각화 기능이 부족합니다. Evidently는 로컬/프라이빗 환경에서 완전한 모니터링을 원하는 팀에 적합합니다.
Evidently는 Reports와 Test Suites라는 두 가지 주요 구성 요소로 동작합니다. 보고서는 탐색적 분석에, 테스트 스위트는 CI/CD 파이프라인에 적합합니다.
# 최신 버전 설치 (pip)
pip install evidently
# 특정 버전 (권장: 0.4.x 이상)
pip install evidently==0.4.28
import pandas as pd
from evidently.report import Report
from evidently.metric_preset import DataDriftPreset
# 1. 데이터 준비 (reference: 학습 시, production: 현재)
reference = pd.read_csv("reference_data.csv")
production = pd.read_csv("production_data.csv")
# 2. 리포트 생성
report = Report(metrics=[
DataDriftPreset(stattest="ks", stattest_threshold=0.05)
])
# 3. 실행
report.run(reference_data=reference, current_data=production)
# 4. 저장 / 보기
report.save_html("drift_report.html")
report.json() # JSON 형태로도 출력 가능
# CLI로 리포트 생성 (데이터 파일 필요)
evidently --reference reference.csv --current production.csv \
--report drift --output report.html
# 도움말
evidently --help
💡 Tip: 노트북 환경에서는 report.show()를 사용하면 인라인으로 바로 시각화할 수 있습니다.
| 파라미터 / 설정 | 타입 | 기본값 | 설명 |
|---|---|---|---|
stattest |
str | "ks" | 드리프트 검정 통계량: "ks", "chi-square", "wasserstein", "jensenshannon" 등 |
stattest_threshold |
float | 0.05 | p-value 임계값, 이보다 작으면 드리프트로 판정 |
ColumnMapping.target |
str / None | None | 타겟 컬럼명 (실제 레이블) |
ColumnMapping.prediction |
str / list | None | 예측 컬럼명 (분류: 확률 리스트 가능) |
ColumnMapping.numerical_features |
list | 모든 숫자형 | 분석할 숫자 특성 리스트 |
ColumnMapping.categorical_features |
list | 모든 범주형 | 분석할 범주 특성 리스트 |
DataDriftPreset.agg_method |
str | "avg" | 특성 그룹화 시 집계 방식 ("avg", "max", "min") |
Report.include |
dict | — | 포함/제외할 특성 지정 (예: {"include": ["feat1"]}) |
⚠️ 주의: stattest_threshold를 너무 낮게 설정하면 민감도가 높아져 잦은 알람이 발생할 수 있습니다. 도메인에 따라 0.01~0.1 사이를 권장합니다.
| 문제 | 원인 | 해결책 |
|---|---|---|
KeyError: 타겟/예측 컬럼 없음 |
ColumnMapping 미설정 |
명시적으로 ColumnMapping(target='y', prediction='pred') 설정 |
| 리포트가 너무 느림 | 특성 수가 많거나 데이터 크기가 큼 | include/exclude로 특성 축소, 또는 샘플링 사용 |
| 드리프트가 항상 탐지됨 | 임계값이 너무 낮거나 데이터에 잡음이 많음 | stattest_threshold를 0.05→0.01로 낮추거나, 다른 통계량 사용 |
| CLI 명령어 에러 | 파일 경로 문제 또는 버전 불일치 | pip install --upgrade evidently 후 절대 경로 사용 |
| HTML 리포트가 열리지 않음 | 브라우저 보안 정책 (로컬 파일) | --allow-file-access 플래그로 열거나, http 서버 사용 |
💡 Tip: 공식 문서의 “How-to Guides” 섹션에서 실전 통합 예제를 확인하세요.