Modeling Objective의 사용자 정의 평가 라이브러리
평가 라이브러리는 여러 목표에서 같은 성능, 공정성 또는 강건성 계산을 재사용하는 Python 패키지입니다. 기본 이진 분류와 회귀 평가기로 필요한 지표를 만들 수 없다면 사용자 정의 Evaluator를 게시하여 목표의 평가 설정에서 선택할 수 있습니다.
게시한 라이브러리를 볼 권한이 있는 사용자는 평가기를 선택할 수 있습니다. UI의 이름, 설명, 설정 인자와 지표 설명은 구현 클래스의 docstring에서 가져옵니다.
저장소와 모듈
프로젝트에서 + New > Repository type > Model Integration을 선택하고 Language template을 Model Evaluator Template Library로 정한 뒤 Initialize repository를 선택합니다.
기본 구현 파일은 src/evaluator/custom_evaluator.py입니다. Evaluator 인터페이스 구현을 커밋하고 저장소의 새 버전 태그를 게시하면 등록합니다.
한 저장소에서 여러 평가기를 게시할 수 있습니다. 추가 Python 파일에 구현하면 build.gradle의 modelEvaluator.modules에도 해당 모듈을 등록합니다. 기본 파일의 모듈 이름은 evaluator.custom_evaluator입니다. 예를 들어 실제 fairness_evaluator.py를 추가했다면 evaluator.fairness_evaluator도 목록에 추가합니다.
Evaluator 인터페이스
apply_spark(self, df: pyspark.sql.DataFrame) -> List[ComputedMetricValue]를 구현합니다. 전달받은 Spark 표에서 실제 지표를 계산하고 ComputedMetricValue 목록을 반환합니다.
필수 docstring 항목은 display-name과 description입니다. param으로 설정 인자 설명을, metric으로 생성할 지표 설명을 0개 이상 추가할 수 있습니다.
행 수 평가기
다음 구현은 설정 인자 없이 입력 행 수를 계산합니다. UI 이름은 Row Count Evaluator, 지표 이름은 Row Count입니다.
from typing import List
from pyspark.sql import DataFrame
from foundry_ml_metrics.evaluation import ComputedMetricValue, Evaluator
class CustomEvaluator(Evaluator):
"""
:display-name: Row Count Evaluator
:description: This evaluator calculates the row count of the input DataFrame.
:metric Row Count: The row count
"""
def apply_spark(self, df: DataFrame) -> List[ComputedMetricValue]:
row_count = df.count()
return [
ComputedMetricValue(
metric_name='Row Count',
metric_value=row_count
)
]
설정 가능한 평가기
목표는 사용자가 입력한 설정 값을 실행 시 생성자에 전달합니다. 지원하는 설정 타입은 다음과 같습니다.
| 타입 | 설정 값 |
|---|---|
| int | 정수 |
| float | 실수 |
| bool | True 또는 False |
| str | 문자열 |
| Field[float] | 입력 표의 실수 열 |
| Field[int] | 입력 표의 정수 열 |
| Field[str] | 입력 표의 문자열 열 |
선택 인자는 typing.Optional로 감쌉니다. 예를 들어 Optional[str] 또는 Optional[Field[str]]를 사용할 수 있습니다.
다음은 앞의 기본 클래스를 대체하는 설정형 구현입니다. column은 정수 열을 선택하는 Field[int], value는 비교할 정수입니다. 전체 Row Count와 선택한 값으로 필터링한 Filtered Row Count를 반환합니다.
from typing import List
from pyspark.sql import DataFrame
from pyspark.sql import functions as F
from foundry_ml_metrics.evaluation import ComputedMetricValue, Evaluator, Field
class CustomEvaluator(Evaluator):
"""
:display-name: Configurable Row Count Evaluator
:description: This evaluator calculates the row count of the input DataFrame, filtered to the specified value.
:param column: Filtered column
:param value: Filtered value
:metric Row Count: The unfiltered row count
:metric Filtered Row Count: The filtered row count
"""
column: Field[int]
value: int
def __init__(self, column: Field[int], value: int):
self.column = column
self.value = value
def apply_spark(self, df: DataFrame) -> List[ComputedMetricValue]:
column_name = self.column.name
column_value = self.value
row_count = df.count()
filtered_row_count = df.filter(
F.col(column_name) == column_value
).count()
return [
ComputedMetricValue(
metric_name='Row Count',
metric_value=row_count
),
ComputedMetricValue(
metric_name='Filtered Row Count',
metric_value=filtered_row_count
)
]
변경을 사용하려면 커밋하고 새 저장소 태그를 게시합니다. 목표의 평가 라이브러리 설정에서 게시한 평가기와 인자를 선택합니다.
Field와 ComputedMetricValue
Field.name은 선택한 실제 열 이름을 담는 문자열입니다. 평가기는 이를 F.col에 전달하여 표를 필터링할 수 있습니다.
ComputedMetricValue(metric_name, metric_value)는 지표 이름과 값을 저장합니다. metric_name은 문자열이고 metric_value는 아래 허용 타입입니다. 부분집합은 목표의 평가 파이프라인이 구성한 데이터 범위와 연결합니다.
MetricValue
지원 숫자는 Python int와 float 및 다음 NumPy 타입입니다.
- np.int8, np.int16, np.int32, np.int64
- np.uint8, np.uint16, np.uint32, np.uint64
- np.float32, np.float64
그림은 matplotlib.Figure 또는 matplotlib.pyplot.Figure를 사용할 수 있습니다. 다른 이미지 객체는 다음 인터페이스 중 정확히 하나를 구현한 경우 사용할 수 있습니다.
| 메서드 | 반환 또는 인자 |
|---|---|
| get_figure(self) | Figure를 반환합니다. 여러 seaborn 플롯이 이 방식을 사용합니다. |
| save(self, path: str) | 지정 경로에 저장합니다. 여러 seaborn 플롯이 이 방식을 사용합니다. |
| savefig(self, path: str) | 지정 경로에 그림을 저장합니다. |
BarChart와 LineChart도 지원합니다. 이 지표 값 계약과 모델 리소스의 Evaluation.log_plot 계약은 구분해야 합니다.