from datasets import load_metric
pearsonr= load_metric('pearsonr')
spearmanr = load_metric('spearmanr')
Hugging Face의 datasets 중 load_metric
은 metric을 간단히 계산할 수 있도록 도와주는 유용한 함수이다. 하지만 현재(2022.03.29) load_metric
을 활용해서 상관계수(pearsonr, spearmanr)를 계산할 경우, 잘못된 값을 얻을 수도 있으니 주의해야 한다.
load_metric
은 일반적으로 scipy.stats.pearsonr
처럼 미리 구현된 metric 함수에 예측 값과 Label 값을 전달하는 방식으로 값을 계산한다. 문제는 상관계수를 측정할 때, 유사도 예측 값과 Label 값의 데이터 타입을 int32
으로 변형하여 전달한다는 것이다. 이 경우 만약 예측과 Label 중 float 타입이 있다면 소수점 값이 무시돼 오차가 발생할 수 있다.
inputs_description=_KWARGS_DESCRIPTION,
features=datasets.Features(
{
"predictions": datasets.Value("int32"), # 오차의 원인
"references": datasets.Value("int32"),
실제로 나는 ELECTRA 모델의 STS 성능을 확인하는 과정에서, 상관계수가 낮게 측정되는 문제가 발생했었다. 처음에는 내가 작성한 코드 부분에 문제가 있다고만 생각해, 코드를 계속 수정했었다. 하지만 그럼에도 문제가 해결되지 않아, 사용한 함수들의 소스 코드까지 확인하면서 결국 위와 같은 문제 원인을 발견하게 됐다.
처음엔 내가 사용했던 pearsonr의 문제만 확인했었는데, 혹시 몰라 유사한 역할을 하는 spearmanr의 코드도 추가로 살펴봤다. 확인해본 결과 spearmanr에서도 역시 같은 문제가 발생하고 있었다.
발견한 문제를 알아두고 앞으로 주의하는 것도 좋지만, 많은 사람이 사용하는 오픈소스인 만큼 다음에 분명 나와 같은 문제를 겪을 사람이 또 생길 수밖에 없다고 생각했다. 따라서 이러한 문제가 완전히 해결될 수 있도록, datasets의 repo에 관련된 내용을 issues로 남겼다.
신기하게도 이슈를 남긴지 1시간 만에 확인 했다는 답변을 받고, 같은 날에 merge까지 진행된 것을 확인했다. 오픈 소스에 작게나마 기여한 거 같아서 기분이 좋다.