게시된 모델 버전 평가
평가(Evaluation)는 특정 모델 버전이 시험 데이터에서 보인 결과를 지표, 이미지, 플롯과 표로 기록합니다. 학습 중 단계별 변화를 기록하는 실험(Experiment)과 달리, 완성된 모델 버전의 평가 결과 한 묶음을 저장합니다. 결과는 모델의 Evaluations 탭에서 비교합니다.
평가 집합
Evaluation set은 같은 평가 방법으로 만든 결과를 묶는 논리적 그룹입니다. 모든 평가는 한 집합에 속하며 집합은 여러 모델 버전의 결과를 보관합니다. 모델 하나에 최대 100개 평가 집합을 만들 수 있습니다.
예를 들어 주택 가격 모델에서 전국 예측의 MAE와 R²를 보는 전국 오차 분석, affordable, mid_range와 luxury 구간의 오차 및 잔차 분포를 보는 가격대 분석을 서로 다른 집합으로 관리할 수 있습니다.
Code Repositories에서는 @pm.transforms.evaluation에 집합 이름을 고정합니다. 같은 변환을 다시 실행하면 같은 집합에 새 평가를 기록합니다. 평가 방법을 다르게 구성하려면 집합 이름이 다른 변환을 정의합니다.
작성 조건과 커밋
저장소를 업그레이드하고 palantir_models 0.2384.0 이상을 설치합니다. 평가 코드를 실행하는 저장소와 대상 모델은 같은 프로젝트에 있어야 합니다. 서로 다른 프로젝트이면 기록 권한 오류가 발생하므로 리소스를 같은 프로젝트로 옮겨야 합니다.
@pm.transforms.evaluation("error_analysis")를 @transform.using(...) 위에 적용하면 해당 변환의 각 ModelInput에 연결된 평가 집합을 구성합니다. 데이터 입력은 Input으로, 평가할 모델은 palantir_models.transforms.ModelInput으로 선언합니다. 변환 안에서 model_input.create_evaluation(name="my-evaluation")으로 결과 객체를 만듭니다. 평가 데코레이터는 필수이며 집합이 없으면 첫 실행에 생성합니다.
평가 이름이 중복되어도 자동으로 구분합니다. 이름을 생략하면 집합 이름을 사용합니다. 빌드가 성공하면 평가를 해당 집합에 커밋하고 실패하면 중단하여 결과를 게시하지 않습니다.
평가 작성과 실행에 실제 추론과 지표 계산을 포함한 변환, 버전 선택과 브랜치 평가가 있습니다. 내장 평가기는 표준 회귀 및 분류 지표를 계산합니다. 새 버전 또는 일정에 따라 실행하는 구성은 평가 보기에서 관리합니다.
부분집합 이름
지표, 이미지, 플롯과 표 이름에 prefix/name 형식을 쓰면 관련 결과를 묶을 수 있습니다. UI는 접두사 또는 결과 이름을 기준으로 그룹화합니다. 접두사는 첫 번째 / 앞의 문자열이며 데이터 분할 로직은 평가 코드가 정합니다.
예를 들어 전국의 mae와 r2는 nationwide/mae 및 nationwide/r2로 기록합니다. 지역별로 northeast, southeast와 west를 쓰면 같은 지표를 지역끼리 비교할 수 있습니다. 가격대별 잔차 플롯은 affordable/residuals, mid_range/residuals와 luxury/residuals로 기록합니다.
다음 함수의 metrics_by_region은 지역별로 실제 계산한 지표 사전이고 residual_figures는 가격대별 Plotly Figure입니다.
def record_subsets(evaluation, metrics_by_region, residual_figures):
for region, metrics in metrics_by_region.items():
evaluation.log_metrics({f"{region}/{name}": value for name, value in metrics.items()})
for price_tier, figure in residual_figures.items():
evaluation.log_plot(f"{price_tier}/residuals", figure)
기록 자료형
| 기록 | 메서드와 입력 |
|---|---|
| 지표 | log_metric 또는 log_metrics에 int/float 값을 기록합니다. |
| 이미지 | log_image에 PNG 경로, PNG 바이트 또는 Pillow 이미지를 전달합니다. 다른 파일 형식은 거부합니다. 선택 설명은 caption입니다. |
| 플롯 | log_plot에 plotly.graph_objects.Figure를 전달합니다. 다른 플롯 타입은 거부합니다. 선택 설명은 description입니다. |
| 표 | log_table에 pandas 또는 Polars DataFrame을 전달합니다. 다른 자료형은 거부합니다. 선택 설명은 description입니다. |
평가 기록에는 step 인자가 없습니다. 같은 지표 키를 다시 쓰면 이전 값을 덮어씁니다. Python API에 각 메서드의 인자 이름과 기본값이 있습니다.
지표와 시각 자료 함께 기록
평가 데코레이터를 적용한 변환 안에서 다음 함수를 호출합니다. mae와 r2는 계산한 수치, pillow_image는 이미지, fig는 그래프, error_by_tier는 결과 표입니다. 기록 이름과 실제 계산 조건을 일치시켜야 다른 모델 버전과 비교할 수 있습니다.
def record_evaluation(model_input, mae, r2, pillow_image, fig, error_by_tier):
evaluation = model_input.create_evaluation(name="my-evaluation")
evaluation.log_metric("mae", mae)
evaluation.log_metrics({"mae": mae, "r2": r2})
evaluation.log_image("residual_distribution", pillow_image)
evaluation.log_plot("residuals_by_tier", fig)
evaluation.log_table("error_by_price_tier", error_by_tier)
이미지로 남기는 잔차 차트
실제 예측 가격과 잔차 및 쓰기 가능한 PNG 경로를 받아 차트를 저장하고 기록합니다.
import matplotlib.pyplot as plt
def record_residual_image(evaluation, predicted_prices, residuals, png_path):
figure, axis = plt.subplots()
axis.scatter(predicted_prices, residuals)
axis.set_xlabel("Predicted Price")
axis.set_ylabel("Residual")
figure.savefig(png_path)
plt.close(figure)
evaluation.log_image("residual_scatter", png_path)
가격대 플롯과 표
다음 함수의 rows에는 price_tier와 residual 열이 있어야 합니다. error_by_tier에는 실제로 계산한 가격대별 mae와 r2 같은 지표를 넣습니다.
import plotly.express as px
def record_price_tier_analysis(evaluation, rows, error_by_tier):
figure = px.box(rows, x="price_tier", y="residual", title="Residuals by Price Tier")
evaluation.log_plot(
"residuals_by_tier", figure,
description="Residual distribution across all price tiers",
)
evaluation.log_table("error_by_price_tier", error_by_tier)
한도
| 항목 | 한도 |
|---|---|
| 지표 이름 | 최대 100자 |
| 이미지, 플롯 또는 표 이름 | 최대 100자 |
| 이미지 caption | 최대 200자 |
| 이미지, 플롯 또는 표 한 개의 업로드 크기 | 최대 5 MB |
| 표 한 개의 행 수 | 최대 100,000행 |
| 모델당 평가 집합 | 최대 100개 |
한도를 늘려야 하면 Palantir Support에 문의합니다. 기록 권한, 버전 비교와 실험의 차이는 평가 질문에서 확인할 수 있습니다.