단일 지표뿐만 아니라 모델의 다양한 측면을 포착하는 다양한 지표를 평가하고자 하는 경우가 많습니다. 예를 들어 분류의 경우 일반적으로 모델 성능을 더 잘 파악하기 위해 정확도 외에도 F1 Score, Recall, Precision를 계산하는 것이 좋습니다. 물론 여러 메트릭을 로드하고 순차적으로 호출할 수 있습니다. 그러나 더 편리한 방법은 결합() 함수를 사용하여 함께 묶는 것입니다:
Downloading builder script: 0%| | 0.00/2.87k [00:00<?, ?B/s]
[nltk_data] Downloading package punkt to /home/kubwa/nltk_data...
[nltk_data] Package punkt is already up-to-date!
평가 결과를 저장하고 공유하는 것은 중요한 단계입니다. 지표 결과를 쉽게 저장할 수 있도록 evaluate.save() 함수를 제공합니다. 특정 파일 이름이나 디렉터리를 전달할 수 있습니다. 후자의 경우 결과는 자동으로 생성된 파일 이름으로 파일에 저장됩니다. 이 함수는 디렉터리나 파일 이름 외에도 키-값 쌍을 입력으로 받아 JSON 파일에 저장합니다.
evaluate.push_to_hub() 함수를 사용하면 평가 결과를 모델의 리포지토리에 쉽게 보고할 수 있습니다:
evaluate.push_to_hub(
model_id="huggingface/gpt2-wikitext2", # model repository on hub
metric_value=0.5, # metric value
metric_type="bleu", # metric name, e.g. accuracy.name
metric_name="BLEU", # pretty name which is displayed
dataset_type="wikitext", # dataset name on the hub
dataset_name="WikiText", # pretty name
dataset_split="test", # dataset split used
task_type="text-generation", # task id, see https://github.com/huggingface/datasets/blob/master/src/datasets/utils/resources/tasks.json
task_name="Text Generation" # pretty name for task
)
Visualization
여러 모델을 비교할 때 단순히 점수만 보고는 성능의 차이를 파악하기 어려운 경우가 있습니다. 또한 최고의 모델이 하나만 있는 것이 아니라 지연 시간과 정확도 사이에 상충 관계가 있는 경우가 많으며, 더 큰 모델은 성능이 더 좋을 수 있지만 또한 더 느릴 수도 있습니다. 사용 사례에 가장 적합한 모델을 더 쉽게 선택할 수 있도록 플롯과 같은 다양한 시각화 접근 방식을 점진적으로 추가하고 있습니다.
Evaluator는 즉시 트랜스포머 파이프라인과 함께 작동하도록 설계되었습니다. 하지만 많은 경우 트랜스포머 에코시스템에 속하지 않는 모델이나 파이프라인이 있을 수 있습니다. 그래도 평가기를 사용하여 이러한 모델이나 파이프라인에 대한 지표를 쉽게 계산할 수 있습니다. 이 가이드에서는 Scikit-Learn 파이프라인과 Spacy 파이프라인에 대해 이 작업을 수행하는 방법을 보여드립니다. Scikit-Learn 사례부터 시작하겠습니다.
scikit-learn
IMDB 데이터셋으로 불러와서 scikit-learn pipeline으로 Text Classification을 수행해보겠습니다.
from datasets import load_dataset
ds = load_dataset("imdb")
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
text_clf = Pipeline([
('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', MultinomialNB()),
])
text_clf.fit(ds["train"]["text"], ds["train"]["label"])
Pipeline(steps=[('vect', CountVectorizer()), ('tfidf', TfidfTransformer()),
('clf', MultinomialNB())])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class="sk-container" hidden><div class="sk-item sk-dashed-wrapped"><div class="sk-label-container"><div class="sk-label fitted sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-5" type="checkbox" ><label for="sk-estimator-id-5" class="sk-toggleable__label fitted sk-toggleable__label-arrow fitted"> Pipeline<a class="sk-estimator-doc-link fitted" rel="noreferrer" target="_blank" href="https://scikit-learn.org/1.4/modules/generated/sklearn.pipeline.Pipeline.html">?<span>Documentation for Pipeline</span></a><span class="sk-estimator-doc-link fitted">i<span>Fitted</span></span></label><div class="sk-toggleable__content fitted"><pre>Pipeline(steps=[('vect', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', MultinomialNB())])</pre></div> </div></div><div class="sk-serial"><div class="sk-item"><div class="sk-estimator fitted sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-6" type="checkbox" ><label for="sk-estimator-id-6" class="sk-toggleable__label fitted sk-toggleable__label-arrow fitted"> CountVectorizer<a class="sk-estimator-doc-link fitted" rel="noreferrer" target="_blank" href="https://scikit-learn.org/1.4/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html">?<span>Documentation for CountVectorizer</span></a></label><div class="sk-toggleable__content fitted"><pre>CountVectorizer()</pre></div> </div></div><div class="sk-item"><div class="sk-estimator fitted sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-7" type="checkbox" ><label for="sk-estimator-id-7" class="sk-toggleable__label fitted sk-toggleable__label-arrow fitted"> TfidfTransformer<a class="sk-estimator-doc-link fitted" rel="noreferrer" target="_blank" href="https://scikit-learn.org/1.4/modules/generated/sklearn.feature_extraction.text.TfidfTransformer.html">?<span>Documentation for TfidfTransformer</span></a></label><div class="sk-toggleable__content fitted"><pre>TfidfTransformer()</pre></div> </div></div><div class="sk-item"><div class="sk-estimator fitted sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-8" type="checkbox" ><label for="sk-estimator-id-8" class="sk-toggleable__label fitted sk-toggleable__label-arrow fitted"> MultinomialNB<a class="sk-estimator-doc-link fitted" rel="noreferrer" target="_blank" href="https://scikit-learn.org/1.4/modules/generated/sklearn.naive_bayes.MultinomialNB.html">?<span>Documentation for MultinomialNB</span></a></label><div class="sk-toggleable__content fitted"><pre>MultinomialNB()</pre></div> </div></div></div></div></div></div>
Transformer 텍스트 분류 파이프라인의 규칙에 따라 파이프라인은 호출 가능하고 사전 목록을 반환해야 합니다. 또한 작업 속성을 사용하여 파이프라인이 평가기와 호환되는지 확인합니다. 이를 위해 작은 래퍼 클래스를 작성할 수 있습니다:
Custom Transformer pipeline
class ScikitEvalPipeline: def __init__(self, pipeline): self.pipeline = pipeline self.task = "text-classification" def __call__(self, input_texts, **kwargs): return [{"label": p} for p in self.pipeline.predict(input_texts)]pipe = ScikitEvalPipeline(text_clf)
from evaluate import evaluatortask_evaluator = evaluator("text-classification")task_evaluator.compute(pipe, ds["test"], "accuracy")